2011-04-08 61 views
0

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

目前我的观点看起来像这样:

#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)` 

和我的模型形式是这样的:

​​

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和例子,但到目前为止没有运气。

+0

“WineReviewForm”Meta类中有一些缩进问题,还是只在这里? – manji 2011-04-08 16:24:36

+0

你可以发布你的整个模型吗?当我展示自己的例子时,我将这两个字段排除在元字段属性之外,因为您明确地设置了这些字段。确保这不是问题。 – DTing 2011-04-08 17:56:03

+0

@manji对不起,刚刚在SO上,修正并添加了whol modelForm。 – bmartinek 2011-04-08 18:44:29

回答

0

它实际上看起来像你不需要你的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

+0

再次感谢您的帮助,下次我在SJ时,我欠你一瓶啤酒。现在,我可以更改评论,但第二位用户无法查看葡萄酒。 '错误:评论与此酒已经存在.'将包括表格模板,它有点lonmg虽然... – bmartinek 2011-04-08 19:50:40

+0

好吧张贴上面的表格,SO格式还是有点新对我来说。希望它的可读性略好。 – bmartinek 2011-04-08 19:56:45

+0

@bmartinek我认为这是由您的模型中的错误造成的?你的'wine'字段有属性'unique = True'吗?您可能希望查看独特的Meta属性http://docs.djangoproject.com/zh/dev/ref/models/options/#unique-together,而不是将葡萄酒设置为唯一,因为这会导致错误,而不管用户改变。啊,我只是看着你的第一个问题,那肯定是问题所在。为用户字段删除'unique = True'。 – DTing 2011-04-08 21:46:35