2016-03-20 24 views
3

Sitemde PostgreSQL veritabanımdaki bilgileri çalıştıran ve kaydeden çok sayıda form var. Benim Seti Modeli için bilgileri kaydetmek için bir form oluşturmak çalışıyorum:Django formu, ModelChoiceField ile kaydedilmiyor - ForeignKey

class Set(models.Model): 
    settitle = models.CharField("Title", max_length=50) 
    setdescrip = models.CharField("Description", max_length=50) 
    action = models.ForeignKey(Action) 
    actorder = models.IntegerField("Order number") 

Set Formu buna benzer.

def createset(request): 
    if not request.user.is_authenticated(): 
     return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path)) 
    elif request.method == "GET": 
     #create the object - Setform 
     form = SetForm; 
     #pass into it 
     return render(request,'app/createForm.html', { 'form':form }) 
    elif "cancel" in request.POST: 
     return HttpResponseRedirect('/actions') 
    elif request.method == "POST": 
    # take all of the user data entered to create a new set instance in the table 
     form = SetForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/actions') 
     else: 
      form = SetForm() 
      return render(request,'app/createForm.html', {'form':form}) 

formu: Ben Eylem modelinden Eylem adı alanların listesini çekmek için ModelChoiceField kullanıyorum, bu createset için görünüm altındadır

class SetForm(ModelForm): 

    class Meta: 
     model = Set 
     fields = ['settitle', 'setdescrip', 'action', 'actorder'] 
    action = forms.ModelChoiceField(queryset = Action.objects.values_list('name', flat=True), to_field_name="id") 

seçkin açılır olarak form üzerinde görüntüler doldurulur ve geçerli ve Kaydet düğmesine basılmazsa, hiçbir şey olmaz. Hata yok, sayfa yeni bir forma yeniliyor. Eğer action alanını forms.py kullanarak ayarlamadıysam (action = forms.ModelChoiceField (queryset = Action.objects.values_list ('name', flat = True), to_field_name = "id")) veri kaydeder Bu yüzden yanlış bir şey yapıyorum muhtemelen. Sadece ne olduğundan emin değil misin?

cevap

5

https://docs.djangoproject.com/en/stable/ref/forms/fields/#django.forms.ModelChoiceField.queryset

queryset özelliğin bir QuerySet olmalıdır. values_list bir liste döndürür.

Yalnızca Action modelinizin __str__ yöntemini tanımlamanız ve formdaki eylem alanını yeniden tanımlamanız gerekmeyecektir.

Ayarlanmışsa ve başka bir etiket kullanmak istiyorsanız, ModelChoiceField alt sınıfını kullanabilirsiniz.

modeli yöntemi __str__ (Python 2 __unicode__) alanın seçenek kullanım için nesnelerin dize temsillerini oluşturmak için çağrılır; Özelleştirilmiş temsiller sağlamak için, ModelChoiceField alt sınıfını ve label_from_instance'u geçersiz kılın. Bu yöntem bir model nesne alacak ve onu temsil etmek için uygun bir dize döndürmelidir. Örneğin:

from django.forms import ModelChoiceField 

class MyModelChoiceField(ModelChoiceField): 
    def label_from_instance(self, obj): 
     return "My Object #%i" % obj.id 

Yani, senin durumunda, ya __str__ yöntem Action modelini ayarlamayı ve formda action = forms.ModelChoiceField(...) satırını kaldırın:

class Action(models.Model): 
    def __str__(self): 
     return self.name 

class SetForm(ModelForm): 

    class Meta: 
     model = Set 
     fields = ['settitle', 'setdescrip', 'action', 'actorder'] 

Ya ya bir özel ModelChoiceField tanımlayın:

class MyModelChoiceField(forms.ModelChoiceField): 
    def label_from_instance(self, obj): 
     return obj.name 

class SetForm(ModelForm): 

    class Meta: 
     model = Set 
     fields = ['settitle', 'setdescrip', 'action', 'actorder'] 

    action = MyModelChoiceField(Action.objects.all()) 
+0

Çok teşekkürler! Şimdi çalışıyor – RebeccaRol