【问题标题】:ModelForm not passing all parametersModelForm 未传递所有参数
【发布时间】:2011-04-08 16:18:27
【问题描述】:

在@kreigar 的一些great help 之后,我能够开始使用django 的ModelForm 而不是form.Forms。现在唯一的问题是我没有通过两个主键来关联我的评论表单:-(。

目前我的看法是这样的:

 #views.py

 @login_required
 def wine_review_page(request, wine_id):
   wine = get_object_or_404(Wine, pk=wine_id)
   review = None
   if Review.objects.filter(user=request.user, wine=wine).exists():
      review = Review.objects.get(user=request.user, wine=wine)

   if request.method == 'POST':
     form = WineReviewForm(request.POST, instance=review)
     if form.is_valid():
        form.save()   
        return HttpResponseRedirect('/detail/%s/' % wine_id )
   else:
     form = WineReviewForm(instance=review)

   variables = RequestContext(request, {'form': form, 'wine': wine })
   return render_to_response('wine_review_page.html', variables)`

我的模型是这样的:

 #models.py

class WineReviewForm(ModelForm):
    class Meta:
        model = Review
        widgets = {
            'wine': HiddenInput(),
            'user': HiddenInput(),
            'like_dislike': HiddenInput(),
            'fave': HiddenInput(),
            'sweet_dry': HiddenInput(),
            'crisp_buttery: HiddenInput(),
            'fruity_earthy': HiddenInput(),
            'smooth_spicy': HiddenInput(),
            'light_robust': HiddenInput(),
            'label_rating': HiddenInput()
            }

Wine_review_form:

 <form method="post" action="/review/{{ wine.id }}/">
 {% csrf_token %}
 {{form.as_p}}


<div id="form_div" data-role="fieldcontain">
<script>
$('#form_div > input').hide();
</script>

{% if wine.wine_kind == 'whites' %}
<div class="slider_labels">
    <span id="sweet_text"class="left_slider_text">Sweet</span>
    <span id="dry_text"class="right_slider_text">Dry</span>
</div>
<input type="range"  name="sweet_dry" id="sweet_dry_slider" value="50" min="0" max="100" onchange="sweetDryValue(this.value)" />

<div class="slider_labels">
    <span id="crisp_text"class="left_slider_text">Crisp</span>
    <span id="buttery_text"class="right_slider_text">buttery</span>
</div>
<input type="range"  name="crisp_buttery" id="crisp_buttery_slider" value="50" min="0" max="100" onchange="crispButteryValue(this.value)" />

{% else %}

<div class="slider_labels">
    <span id="fruity_text"class="left_slider_text">Fruity</span>
    <span id="earthy_text"class="right_slider_text">Earthy</span>
</div>
<input type="range"  name="fruity_earthy" id="fruity_earthy_slider" value="50" min="0" max="100" onchange="fruityEarthyValue(this.value)" />

<div class="slider_labels">
    <span id="smooth_text" class="left_slider_text">Smooth</span>
    <span id="spicy_text" class="right_slider_text">Spicy</span>
</div>
<input type="range" name="smooth_spicy" id="smooth_spicy_slider" value="50" min="0" max="100" onchange="smoothSpicyValue(this.value)" />

{% endif %}

<div class="slider_labels">
    <span id="light_text"class="left_slider_text">Light</span>
    <span id="robust_text" class="right_slider_text">Robust</span>
</div>
<input type="range"  name="light_robust" id="light_robust_slider" value="50" min="0" max="100" onchange="lightRobustValue(this.value)" />



<div class="slider_labels">
    <span id="sad" class="left_slider_text">Sad</span>
    <span id="rad" class="right_slider_text">Rad</span>
    <div id="label_rating">Label Rating</div>

</div>
<input type="range" name="label_rating" id="label_rating_slider" value="50" min="0" max="100" onchange="labelRatingValue(this.value)" />

<br>
<br>
<div class="ui-grid-b">
    <div class="ui-block-a">
        <input type="radio" name="like_dislike" id="like" value="like" />
    <label for="like">like</label>
    </div>
    <div class="ui-block-b">
        <input type="radio" name="like_dislike" id="dislike" value="dislike"  />
    <label for="dislike">dislike</label>
    </div>
    <div class="ui-block-c">
        <input type="checkbox" name="fave" id="checkbox-1" class="custom" />
        <label for="checkbox-1">fave</label>
    </div>

    </div>          
</fieldset>
</div>

<input type="submit" value="Judged!" rel="external"/>

检查我的帖子请求时,我唯一没有通过的是:wine_id 和 user_id。这真是令人困惑。

我错过了一些简单的东西吗?

我查看了documentation 和示例,但到目前为止还没有运气。

【问题讨论】:

  • 您在WineReviewForm Meta 类中存在一些缩进问题,还是仅在此处?
  • 你能发布你的整个模型吗?当我展示我的示例时,我将这两个字段排除在元“字段”属性之外,因为您明确设置了这些字段。确保这不是问题。
  • @manji 抱歉,这只是在 SO,修复并添加了整个 modelForm。
  • @kriegar - 我没有在上面的模型表单中添加添加字段属性。我认为它包括所有内容,除非您使用部分形式:docs.djangoproject.com/en/dev/topics/forms/modelforms/…
  • 你是对的。您的代码已被编辑,所以我不知道您是否刚刚离开了您的问题,或者您是否没有使用它。

标签: django-views django-forms


【解决方案1】:

实际上,您似乎不需要 wine_id 和 user_id(除非您希望允许用户为其他用户发布评论,或者即时切换他们正在评论的葡萄酒)。

这应该适合你:

@login_required
def wine_review_page(request, wine_id):
    wine = get_object_or_404(Wine, pk=wine_id)

    if Review.objects.filter(user=request.user, wine=wine).exists():
        review = Review.objects.get(user=request.user, wine=wine)
    else:
        review = Review(user=request.user, wine=wine) #this added

    if request.method == 'POST':
       form = WineReviewForm(request.POST, instance=review)
       if form.is_valid():
           form.save()   
           return HttpResponseRedirect('/detail/%s/' % wine_id )
    else:
       form = WineReviewForm(instance=review)

    variables = RequestContext(request, {'form': form, 'wine': wine })
    return render_to_response('wine_review_page.html', variables)

如果您确实希望允许用户修改这些字段中的任何一个,请编辑您的问题以显示您的模板或用户如何提交数据,因为您的所有字段都使用 hiddenInput 小部件,它很难说任何数据将如何进入请求。POST

【讨论】:

  • 再次感谢您的帮助,下次我在 SJ 时,我欠您一杯啤酒。现在我可以更改评论,但第二个用户无法评论葡萄酒。 error: Review with this Wine already exists. 将包含表单模板,虽然它有点长...
  • 好的,上面的表格,所以格式对我来说还是有点新。希望它有点可读性。
  • @bmartinek 我认为这是由您的模型错误引起的?您的wine 字段是否具有unique=True 属性?您可能希望同时查看唯一的元属性 docs.djangoproject.com/en/dev/ref/models/options/…,而不是将 wine 设置为唯一,因为无论用户如何更改都会导致错误。啊,我刚刚看了你的第一个问题,这绝对是问题所在。删除用户字段的unique=True
  • 嘎!就是这样。太有趣了,我删除了它,但忘记重新启动应用程序。感谢您帮助设置用户和葡萄酒!把啤酒做成 6 瓶装。
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多