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

  • DanceOn

    DanceOn

    6 Mayıs 2006
  • Jabari Johnson

    Jabari Johns

    18 Ocak 2008
  • kndx

    kndx

    11 Mart 2006