SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • atKristaBradford

    atKristaBrad

    4 Aralık 2010
  • Charles Nesson

    Charles Ness

    27 NİSAN 2006
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011