2016-04-16 74 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