2009-06-17 20 views
6

2 soru:Modeller unique_together kısıtlaması + Yok = başarısız?

  • nasıl ebeveyn = Yok ve isim aynı olduğunda oluşturulmasını çiftleri durdurabilirim?
  • Form içinden bir model yöntemini çağırabilir miyim?

tüm ayrıntılarını aşağıda bakınız:

models.py

class MyTest(models.Model): 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children') 
    name = models.CharField(max_length=50) 
    slug = models.SlugField(max_length=255, blank=True, unique=True) 
    owner = models.ForeignKey(User, null=True) 

    class Meta: 
     unique_together = ("parent", "name") 

    def save(self, *args, **kwargs): 
     self.slug = self.make_slug() 
     super(MyTest, self).save(*args, **kwargs) 

    def make_slug(self): 
     # some stuff here 
     return generated_slug 

not: sülük = benzersiz de!

class MyTestForm(forms.ModelForm): 
    class Meta: 
     model = MyTest 
     exclude = ('slug',) 

    def clean_name(self): 
     name = self.cleaned_data.get("name") 
     parent = self.cleaned_data.get("parent") 

     if parent is None: 
      # this doesn't work when MODIFYING existing elements! 
      if len(MyTest.objects.filter(name = name, parent = None)) > 0: 
       raise forms.ValidationError("name not unique") 
     return name 

forms.py Detaylar

unique_together contraint formu parent != None w/mükemmel çalışıyor. Ancak, parent == None (boş) olduğunda, çiftlerin oluşturulmasına izin verir.

Bunu denemek ve bunlardan kaçınmak için, yinelenenleri denetlemeye çalışmak için formu ve tanımlanmış clean_name kullanmayı denedim. Bu, yeni nesneler oluştururken çalışır, ancak varolan nesneleri değiştirirken çalışmaz.

Birisi, ModelForm'un .save üzerinde commit = False kullanmam gerektiğinden bahsetmişti, ancak bunun nasıl yapılacağını/uygulanacağını bulamadım. ModelForm'un bir modeldeki değişiklikleri saptamak ve bunlara izin vermek için has_changed'i kullanmayı düşündüm, ancak has_changed, form ile birlikte yeni oluşturulmuş nesneler üzerinde true olarak geri döner. yardım et! Ayrıca, (biraz farklı bir soru) Form'dan make_slug() model yöntemine erişebilir miyim? Ben in şu anda benim exclude = ('slug',) hattı benim slug alanında 'benzersiz' kısıtlama yok sayar inanıyorum, ve modelleri kaydetmek alanında, yerine slug üretiyorum. Bunun yerine forms.py yapıp yapamayacağını merak ediyordum?

+0

Bkz http://stackoverflow.com/questions/3488264/django-unique-:

if slug: instance = MyTest.object.get(slug=slug) form = MyUpdateTestForm(instance=instance) else: form = MyTestForm() 

ikinci adıma, yani sen, Yanlış = işlemek gibi bir şey getireceğini nerede olduğunu düşünüyorum Bu sorunu ele almak için güncel bir yöntem için birlikte-çalışma-ile-foreignkey-none. Django 1.2 gerektirir. –

cevap

-1

Bunun sizin sorununuzu çözeceğinden emin değilim, ancak kodunuzu en son Django trunk kodunda test etmenizi öneririz. ile alın:

svn co http://code.djangoproject.com/svn/django/trunk/ 

örneğin ticket 9493 bakınız 1.02 olan çıktığından beri unique_together için birkaç düzeltmeleri yapılmıştır.

+0

im zaten çalışan gövde – lostincode

-1

Benzersiz birlikte oluştururken veya güncelleme olup olmadığını farklı bir biçime sahip olabilir küpe

unique_together = (("parent", "name"),) 
+0

artık buna gerek yok – lostincode

0

bir tanımlama grubu olmalıdır.

Formu başlatırken örnek kwarg'ı kullanın.

if form.is_valid(): 
    inst = form.save(commit=False) 
    inst.slug = inst.make_slug() 
    inst.save() 
İlgili konular