2013-01-05 68 views
0

這裏是我的相關機型:的Django的ModelForm的現場退貨的ID,而不是價值

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

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

和的ModelForm:

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不提供我想要的。

+0

你能顯示你的模板和查看代碼嗎? – finspin

+1

您在字段中缺少一個尾隨逗號:'fields =('subtitle',)' –

+0

@finspin添加視圖 – alix

回答

2

首先,刪除您需要從ModelForm定義中刪除fields。因爲它不是你想要的數據。

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 

編輯:取得在評論代碼庫的變化。

+0

非常感謝你:) – alix

+0

但它保存表單時拋出ValueError。 'post.subtitle必須是一個字幕實例'在form.is_valid()中的views.py – alix

+0

在'save()'方法做了一個改變。 – drewman