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?
Bkz http://stackoverflow.com/questions/3488264/django-unique-:
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. –