Django:如何将URL中的外键分配给Createview表单

时间:2018-10-28 15:40:05

标签: python django

我正在尝试为网站上的商品创建一个评论系统。 为了做到这一点,我创建了2个模型,一个用于项目(节日),另一个用于评论。该项目是评论的外键。 我想做的是在URL中传递项目的PK,并将其设置为审阅的外键。
我目前收到此错误: NoReverseMatch位于/ festivals / 55 / 找不到参数'(55,)'的'create_review'。尝试了1种模式:['festivals / create / review / $']

我花了很长时间试图解决这个问题:/

Views.py:

class CreateReview(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
form_class = forms.ReviewFormCreate
model = models.Review
template_name = 'festival_list/review_form.html'
success_url = '/'

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.user = self.request.user
    self.object.save()
    form.instance.festival = get_object_or_404(models.Festival, pk=self.kwargs['pk'])
    return super(CreateReview, self).form_valid(form)

urls.py     path('create/review/<int:pk>',views.CreateReview.as_view(),name='create_review'),

模型

类评论(models.Model):

user = models.ForeignKey(
    User,
    related_name='Reviews',
    on_delete=models.CASCADE,
)
festival = models.ForeignKey(
    Festival,
    related_name='Festival_Reviews',
    on_delete=models.CASCADE
)

模板链接:

<a class="btn btn-success" href="{% url 'festival_list:create_review' festival.pk %}">Add Review</a>

非常感谢您的帮助=]

2 个答案:

答案 0 :(得分:0)

您需要在url中添加主键,例如:

path(
    'create/review/<int:pk>',
    views.CreateReview.as_view(),
    name='create_review'
),

因此,将派生的URL看起来像create/review/123,其中123节日的主键。

评论的网址应如下所示:

<a class="btn btn-success" href="{% url 'festival_list:create_review' pk=festival.pk %}">Add Review</a>

话虽如此,您的Form可能不会接受此消息,因为节日没有填写,因此您应该删除该节日:

class CreateReview(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):

    form_class = forms.ReviewFormCreate
    model = models.Review
    template_name = 'festival_list/review_form.html'
    success_url = '/'

    def create_form(self, *args, **kwargs):
        form = super(CreateReview, self).create_form(*args, **kwargs)
        form.instance.user = self.request.user
        form.instance.festival_id = self.kwargs['pk']
        return form

,因此从表单本身中删除了festivaluser(您可能不希望用户篡改它,因为否则人们可以像其他用户一样发表评论)。 / p>

答案 1 :(得分:-1)

我遇到了同样的问题,因为我在表单页面中再次使用了该URL。 像这样:

<form
    action="{% url 'readersclub_review_create_urlpattern'}"
    method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit Review</button>
</form>

但是我不知道如何解决它。