2016-04-16 59 views
0

我正在处理我的第一个django应用程序。我正在构建一个允许用户评价啤酒的应用程序。我希望我的用户能够编辑他们已经创建的条目。我带他们到ModelForm,并要求他们进入。当POST方法被调用时,我的数据是无效的。这里是我的model.py:使用ModelForm编辑模型数据:ModelForm验证错误

from django.db import models 


class Rating(models.Model): 
    beer_name = models.TextField() 
    score = models.DecimalField(max_digits=2, decimal_places=1) 
    notes = models.TextField(blank=True) 
    brewer = models.TextField(blank=True) 

和forms.py:

from django import forms 
from ratings.models import Rating 


class RatingForm(forms.ModelForm): 
    class Meta: 
     model = Rating 
     fields = ['beer_name', 'score', 'notes', 'brewer'] 

这里是我的编辑功能的views.py:

def edit(request, row_id): 
    rating = get_object_or_404(Rating, pk=row_id) 
    if request.method == "POST": 
     form = RatingForm(request.POST, instance=rating) 
     if form.is_valid(): 
      form.save() 
      return redirect(home) 
     else: 
      return HttpResponse("Invalid entry.") 
    else: 
     context = {'form': rating} 
     form = RatingForm(instance=rating) 
     return render(
      request, 
      'ratings/entry_def.html', 
      context 
     ) 

然而,每次POST被称为我得到一个“无效的条目。” HttpResponse,意思是我的form.is_valid()被返回False。这是我的模板:

{% extends "base.html" %} 

{% block content %} 
    <div class="container-fluid"> 
    <div class="row"> 
     <div class="col-sm-10 col-sm-offset-1"> 
     <h2>Edit Rating</h2> 
     <form role="form" method="post"> 
      {% csrf_token %} 
      <p>Beer Name: <textarea>{{ form.beer_name }}</textarea></p> 
      <p>Score: <input type="text" name="BeerScore" value="{{ form.score }}"></p> 
      <p>Notes: <textarea>{{ form.notes }}</textarea></p> 
      <p>Brewer: <textarea>{{ form.brewer }}</textarea></p> 
      <p><button type="submit" class="save btn btn-primary">Save</button></p> 
      <p><button type="reset" class="btn btn-primary">Cancel</button></p> 
     </form> 
     </div> 
    </div> 
    </div> 
{% endblock %} 

所以,当我按下我的保存按钮,我得到的回应。这里是我的urls.py编辑网址:

urlpatterns = [ 
    ... 
    url(r'rating/edit/(?P<row_id>[0-9]+)/$', edit , name='rating-edit'), 
] 

回答

0

你包裹在其中没有name属性等字段的字段。这很可能导致将这些值排除在request.POST数据之外。

此外,Django的表单字段都有一个相应的HTML控件。因此,除非需要,否则真的不需要手动呈现HTML。

更改模板代码:

<p> 
    {{ form.beer_name.label }}: {{ form.beer_name }} 
    {% if form.beer_name.errors %} 
    <br />{{ form.beer_name.errors }} 
    {% endif %}{# repeat for other fields as needed #} 
</p> 
<p>{{ form.score.label }}: {{ form.score }}</p> 

<p>{{ form.notes.label }}: {{ form.notes }}</p> 
<p>{{ form.brewer.label }}: {{ form.brewer }}</p> 
<p><button type="submit" class="save btn btn-primary">Save</button></p> 
<p><button type="reset" class="btn btn-primary">Cancel</button></p> 

如果您需要更改小工具,表格类级别这样做:

class RatingForm(forms.ModelForm): 
    class Meta: 
     model = Rating 

    def __init__(self, *args, **kwargs): 
     super(RatingForm, self).__init__(*args, **kwargs) 

     self.fields['notes'].widget = forms.Textarea() 

这样,Django的管理属性和绑定您。

您的视图也可以使用一些清理:

def edit(request, row_id): 
    rating = get_object_or_404(Rating, pk=row_id) 
    form = RatingForm(request.POST or None, instance=rating) 

    if request.method == "POST" and form.is_valid(): 
     form.save() 
     return redirect(home) 

    context = {'form': rating} 
    return render(request, 'ratings/entry_def.html', context) 
+0

真棒!每次我尝试关闭HTML标记时,文本都不可编辑。它只会显示文字。非常感谢! – user3251349

+0

不客气。总是乐于提供帮助。 – Brandon