2012-03-22 15 views
8

Bir address tablo var ve bir postal_code alan vardır ki - PKler doğru varlığını doğrulamak için daha ModelChoiceField bana başka bir şey kullanmasına izin vermiyor? Gitmenin yolu ne olurdu? Normal giriş ve clean_*() kullanın?Django ModelChoiceField - id'den başka bir şey mi kullanıyorsunuz?

+0

ilişki gemi postal_code' modelinin 'arasında' primary_key' ile varsayılan ITS tarafından, nasıl ayarlandığını bağlıdır. Adresiniz ve ilgili "postal_code" modelleri gibi daha fazla ayrıntı verebilir misiniz? Bir 'ModelChoiceField' varsayılan olarak, ilgili modelin varolan örnekleri olarak seçeneklerle bir açılır menü oluşturur. – Pannu

cevap

0

ModelChoiceFields mevcut modeli örneklerinin tercih arasında seçmek için kullanılabilir içindir. Bu hemen hemen her zaman en iyi Seçim alanı tarafından temsil edilir.

Eğer gerçekten ima etmeye çalıştığını olarak Postal_Code için adresinden bir FK var Söylediğin. Her adresle ilgili sorgu için birleştirilmesi gereken ekstra tabloyu haklı çıkarmak için bir PostalCode tablosunda ne saklıyorsunuz?

Çoğu durumda, postal_code basitçe bir CharField olmalıdır ve bu durumda, değerin geçerli olduğunu doğrulamak isterseniz, geçerli posta kodlarının bir listesiyle choices özniteliğini kullanabilirsiniz. Geçerli posta kodlarının bir listesini el ile tutmanın büyük bir güçlük olduğunu unutmayın.

gerçekten yapar, bir PostalCode tablo var ve bu birincil anahtar yerine mutlaka eşsiz olduğundan varsayılan autoincrement olarak Postal_Code kullanarak aslında düşünebilirsiniz iyi bir fikir (bazı durumlarda olabilir) olduğunu düşünüyorsan Verileriniz daha fazla ihraç edilebilir ve sorununuzu doğrulama ile çözer.

1

postal_code, geçerli posta kodları içeren bir PostalCode modelinin yabancı bir anahtarıysa, yalnızca bir CharField kullanın ve önerdiğiniz gibi temizleyin. Benim temiz yöntem şu şekilde görünecektir:

def clean_postal_code(self): 
    try: 
     code = PostalCode.objects.get(code_field=self.data['postal_code']) 
    except: 
     raise forms.ValidationError("Please enter a valid postal code") 
    return code 
20

Ne to_field_name hakkında? Ben her yerde belgelenen pek emin değilim, ancak kolayca ModelChoiceField yapıcı params arasında bulabilirsiniz: https://github.com/django/django/blob/master/django/forms/models.py. Alan sorgulamalarını filtrelemek için kullanılır.

Örneğin

:

articles = ModelChoiceField(queryset=Articles.objects.all(), 
     to_field_name='slug') 
+0

Mükemmel çalışır. instance' argüman 'kullanıldığında' model_to_dict' zorla PK (aslında 'value_for_object') kullanır gibi, kırık dikkat – user240515

+2

, 1.4 (henüz 1.5 denemediyseniz, üzgünüm). ': Bir geçici bir çözüm için 'YourForm ({foo.bar.slug "çubuk"} ..., örneğin = foo ilk =) ilgilidir. Detaylar için bkz. 'BaseModelForm .__ init__'. – drdaeman

+1

@drdaeman [Nitekim] (https://code.djangoproject.com/ticket/20202) – valtron

İlgili konular