首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ModelForm编辑模型数据:ModelForm验证错误

使用ModelForm编辑模型数据:ModelForm验证错误
EN

Stack Overflow用户
提问于 2016-04-16 00:57:48
回答 1查看 2K关注 0票数 0

我正在开发我的第一个django应用程序。我正在开发一个应用程序,允许用户对啤酒进行评级。我希望我的用户能够编辑他们已经创建的条目。我带他们去一个ModelForm,并要求他们进入。当调用POST方法时,我的数据无效。这是我的model.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
        )

然而,每当这个帖子被称为“无效条目”时,我都会得到它。HttpResponse,意思是我的form.is_valid()被返回为False。这是我的模板:

代码语言:javascript
复制
{% 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中的编辑url:

代码语言:javascript
复制
urlpatterns = [
    ...
    url(r'rating/edit/(?P<row_id>[0-9]+)/$', edit , name='rating-edit'),
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-16 02:31:21

您正在将字段包装在没有name属性的其他字段中。这很可能导致request.POST数据中的值被排除在外。

此外,Django表单字段都有相应的HTML小部件。因此,除非您需要手工呈现HTML,否则实际上不需要手工呈现HTML。

将模板代码更改为:

代码语言:javascript
复制
<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>

如果您需要更改小部件,请在表单类级别这样做:

代码语言:javascript
复制
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为您管理属性和绑定。

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36659031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档