1

これが私の関連モデルです:

class Post(models.Model):
    subtitle = models.ForeignKey('Subtitle')

class Subtitle(models.Model):
      name = models.CharField(max_length=30)
      def __unicode__(self):
          return self.name

およびモデルフォーム:

class AddLink(ModelForm):
      subtitle = forms.CharField(label='Subreddit')
      class Meta:
          model = Post
          fields = ('subtitle')

関連ビュー:

@login_required(login_url='/login/')
123 def edit_link(request, post_id):
124     get_post = Post.objects.get(id=post_id)
125     if request.method == 'POST':
126         form = AddLink(request.POST, instance=get_post)
127         if form.is_valid():
128             form.save()
129             return HttpResponseRedirect('/')
130     else:
131         form = AddLink(instance=get_post)
132 
133     context = { 'form': form, 'post': get_post, }
134     template_name = 'edit_post.html'
135     return render_to_response(template_name, context,
136             context_instance=RequestContext(request))

およびテンプレートページ:

  1 <form action="" method="post">
  2     {% csrf_token %}
  3     {{ form.as_p }}
  4     <input type="submit" value="save" />
  5 </form>

この上 ; テンプレートでは、字幕フィールドのIDを返します。その名前ではありません。

テキストボックスで字幕名を提供したい。ModelChoiceFieldは私が欲しいものを提供しません。

4

1 に答える 1

2

まず、定義から削除する必要がある削除fieldsしますModelForm。それはあなたが望むデータではないので。

class AddLink(ModelForm):
  subtitle = forms.CharField(label='Subreddit')
  class Meta:
      model = Post

次に、初期フォームデータを入力する必要があります。

@login_required(login_url='/login/')
def edit_link(request, post_id):
    get_post = Post.objects.get(id=post_id)
    if request.method == 'POST':
         form = AddLink(request.POST, instance=get_post)
         if form.is_valid():
             form.save()
             return HttpResponseRedirect('/')
     else:
         # this line changed
         form = AddLink(instance=get_post, initial={ 'subtitle': get_post.subtitle.name })     
     context = { 'form': form, 'post': get_post, }
     template_name = 'edit_post.html'
     return render_to_response(template_name, context,
             context_instance=RequestContext(request))

また、おそらくsave()モデルにメソッドを追加する必要があります。

def save(self, commit=True):
    post = super(AddLink, self).save(commit=False)
    subtitle_name = self.cleaned_data['subtitle']
    if post.subtitle:
        post.subtitle.name = subtitle_name
    else:
        post.subtitle = new Subtitle(name=subtitle_name)
    post.subtitle.save()
    post.save()
    return post

編集:コメントに基づいてコードベースを変更しました。

于 2013-01-06T04:16:21.580 に答える