31 Mart 2009, Salı
Django admin - içi inlines (veya üç modeli aynı anda düzenleme)
Buna benzeyen modeller bir dizi var:
class Page(models.Model):
title = models.CharField(max_length=255)
class LinkSection(models.Model):
page = models.ForeignKey(Page)
title = models.CharField(max_length=255)
class Link(models.Model):
linksection = models.ForeignKey(LinkSection)
text = models.CharField(max_length=255)
url = models.URLField()
ve bu gibi görünen bir admin.py :
class LinkInline(admin.TabularInline):
model = Link
class LinkSectionInline(admin.TabularInline):
model = LinkSection
inlines = [ LinkInline, ]
class PageAdmin(admin.ModelAdmin):
inlines = [ LinkSectionInline, ]
Amacım bana tek bir sayfada her şeyi düzenlemek sağlayan bir yönetici arayüzü. Bu model yapısı sonuçta artık her şey gibi görünen bir görünüm şablonu oluşturulur
<h1>{{page.title}}</h1>
{% for ls in page.linksection_set.objects.all %}
<div>
<h2>{{ls.title}}</h2>
<ul>
{% for l in ls.link_set.objects.all %}
<li><a href="{{l.url}}">{{l.title}}</a></li>
{% endfor %}
</ul>
</div>
{% endfor %}
Inline-içinde-bir-satır içi hile beklediğim gibi Django admin başarısız, biliyorum. Herkes üç düzey modeli bu tür bir düzenleme izin vermek için bir yol biliyor mu? Şimdiden teşekkürler.
CEVAP
26 AĞUSTOS 2009, ÇARŞAMBA
Bir özel form LinkSectionInline
template oluşturmanız gerekir.
Böyle bir form için çalışması gerekir:
LinkFormset = forms.modelformset_factory(Link)
class LinkSectionForm(forms.ModelForm):
def __init__(self, **kwargs):
super(LinkSectionForm, self).__init__(**kwargs)
self.link_formset = LinkFormset(instance=self.instance,
data=self.data or None,
prefix=self.prefix)
def is_valid(self):
return (super(LinkSectionForm, self).is_valid() and
self.link_formset.is_valid())
def save(self, commit=True):
# Supporting commit=False is another can of worms. No use dealing
# it before it's needed. (YAGNI)
assert commit == True
res = super(LinkSectionForm, self).save(commit=commit)
self.link_formset.save()
return res
(Bu sadece kafamın üstüne çıktı ve test değil, ama doğru yönde gidiyor almak gerekir.)
Şablon sadece form ve form oluşturmak gerekiyor.link_formset uygun.
Bunu Paylaş:
Django Django 1.3 içinde Admin veya aş...
Birden fazla Django admin aynı model i...
Django için ipe Admin'in Modeli G...
Django çalışırken otomatik olarak admi...
Konumlandırma birden fazla işaret aynı...