2016-03-20 7 views
3

自分のサイトに複数のフォームがあり、PostgreSQLデータベースに情報を保存しています。 私は私のセットモデルのための情報を保存するためのフォームを作成しようとしています:DjangoフォームがModelChoiceFieldで保存されない - 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") 

設定したフォームは、次のようになります。

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}) 

フォームを:私はアクションモデルからアクション名フィールドのリストを引っ張ってModelChoiceFieldを使用しています、これはcreatesetのためのビューは以下の通りです

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") 

選択ドロップダウンとしてフォーム上に表示されます有効でSaveが押された場合、何も起こりません。エラーはなく、ページは新しいフォームに更新されます。 (action = forms.ModelChoiceField(queryset = Action.objects.values_list( 'name'、flat = True)、to_field_name = "id")を使用してforms.pyにアクションフィールドを設定しないと、データは保存されます、それは私が間違った何かをしている可能性が高いです。何が分からないの?

答えて

5

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

queryset属性は、クエリセットでなければなりません。 values_listはリストを返します。

アクションモデルの__str__メソッドを定義するだけで、フォーム内のアクションフィールドを再定義する必要はありません。

別のラベルを使用する場合は、ModelChoiceFieldをサブクラス化できます。

__str__(パイソン2に__unicode__)モデルの方法は、フィールドの選択に使用するためのオブジェクトの文字列表現を生成するために呼び出されます。カスタマイズされた表現を提供するために、サブクラスModelChoiceFieldとオーバーライドlabel_from_instanceをオーバーライドします。このメソッドはモデルオブジェクトを受け取り、モデルオブジェクトを表すのに適した文字列を返す必要があります。たとえば、次のように

from django.forms import ModelChoiceField 

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

だから、あなたの場合には、いずれか__str__方法Actionのモデルを設定し、フォームでaction = forms.ModelChoiceField(...)行を削除します。

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

class SetForm(ModelForm): 

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

どちらかがカスタムModelChoiceFieldを定義します。

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

ありがとうございます!それは今働いています – RebeccaRol

関連する問題