2016-04-16 20 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 %} 

私は[保存]ボタンを押すと応答が表示されます。ここに私の編集URLは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

恐ろしい:

あなたのビューには、いくつかのクリーンアップを使用することができます!