【问题标题】:Comments are not saving from frontend in django评论没有从 django 的前端保存
【发布时间】:2021-04-17 09:23:36
【问题描述】:

大家好,cmets 没有使用 CBV,我的表单甚至没有保存评论。这是我的代码,如果有人帮我解决这个问题,我会喜欢的。我的 models.py 是


    class Product(models.Model):
        title = models.CharField(max_length=110)
        slug = models.SlugField(blank=True, unique=True)
        price = models.DecimalField(decimal_places=2, max_digits=6)
        discount_price=models.FloatField(blank=True, null=True)
        size = models.CharField(choices=SIZE_CHOICES, max_length=20)
        color = models.CharField(max_length=20, blank=True, null=True)
        image = models.ImageField(upload_to=upload_image_path)
        description = models.CharField(max_length=1000)
        featured = models.BooleanField(default=False)
        author = models.ForeignKey(User, on_delete=models.CASCADE)
        time_stamp = models.DateTimeField(auto_now_add=True)

        objects=ProductManager()

        def get_absolute_url(self):#i use this in product_list.html to go to detail page
            #return "/product/{slug}".format(slug=self.slug)
            return reverse("products:detail", kwargs={"slug" : self.slug})


        def __str__(self):
            return str(self.title)

        @property
        def name(self):         #sometime in html i say name istead of title so to make it work i wrote this
            return self.title

    def product_pre_save_reciever(sender, instance, *args, **kwargs):#i inherit unique slug generator from utils to here so when i create aa new instance it slug automatically generate. and i i create two t shirts it give a random straing to tshirt 2nd slug
        if not instance.slug:
            instance.slug=unique_slug_generator(instance)

    pre_save.connect(product_pre_save_reciever, sender=Product)


    class Comment(models.Model):
        product=models.ForeignKey(Product , related_name="comments", on_delete=models.CASCADE)
        name = models.CharField(max_length=255)
        body=models.TextField()
        date_added = models.DateTimeField(auto_now_add=True)

        def __str__(self):
            return '%s - %s'%(self.product.title, self.name)

我的 forms.py 是:


    from django import forms
    from .models import Comment

    class CommentForm(forms.ModelForm):
        class Meta:
            model = Comment
            fields = ['name', 'body']

            widgets ={
                'name':forms.TextInput(attrs={'class':'form-control'}),
                'body':forms.Textarea(attrs={'class':'form-control'}),
            }


views.py 是:


    class CommentCreateView(CreateView):
        model = Comment
        form_class = CommentForm
        template_name = 'add-comment.html'
        # fields = '__all__'


        def form_valid(self, form):
            form.instance.product_id = self.kwargs['pk']
            return super().form_valid(form)
        success_url = reverse_lazy('list')

我的 add-comment.html 是:

{% extends "base.html"%}
{% load crispy_forms_tags%}
{% block content %}
  <h2 class="text-center">comment here...</h2>
<div class="col-md-6 offset-md-3">
 <form method="POST">

   {% csrf_token %}
     <fieldset class="form-group">
    {{form|crispy}}
     </fieldset>
<!--     <div class="form-group"><button class="btn btn-outline-info" type="submit">Pubmit</button>-->
<!--     </div>-->
<!--     <input type="submit" value="Submit" class="btn btn-secondary">-->
     <button class="btn btn-secondary">Add comment</button>
 </form>

</div>
{% endblock %}

我的 urls.py 是:



    urlpatterns = [
       # path('featured/' , ProductFeaturedListView.as_view()),
        #path('featured/<int:pk>' , ProductFeaturedDetailView.as_view()),
        path('' , ProductListView.as_view(), name= "list"),
        path('new/' , ProductCreateView.as_view() , name="product-create"),
        path('<slug:slug>/update/' , ProductUpdateView.as_view() , name="product-update"),
        path('<slug:slug>/delete/' , ProductDeleteView.as_view() , name="product-delete"),
        #path('product-fbv/' , product_list_view),
        #path('product/<int:pk>' , ProductDetailView.as_view()),
        path('<slug:slug>/comment' , CommentCreateView.as_view() , name="add-comment"),
        path('<slug:slug>' , ProductDetailSlugView.as_view() , name="detail"),

       # path('product-fbv/<int:pk>' , product_detail_view),

    ]

当我点击发表评论时出现的错误是:

【问题讨论】:

  • 在form_valid中,self.kwargs['pk']来自哪里?
  • 先生,其实我是按照你管的教程来的。我知道我应该用 slug 替换 pk 但是当我写 slug 它给我错误键错误 slug 而不是键错误 pk

标签: javascript python html django web


【解决方案1】:

问题在于您没有为视图提供任何 pk 关键字参数。

从 urls.py,我可以看到你有一个 slug kwargs。然后,您可以通过它的 slug 识别匹配的产品。

在你的views.py中,替换:

form.instance.product_id = self.kwargs['pk']

通过

form.instance.product = Product.objects.get(slug=self.kwargs['slug'])

解释:

您想在此处将您的评论与匹配的产品相关联。因此,为此,您使用NameOfModel.objects.get(query),它返回您模型的一个实例(此处为产品),与query 匹配。在您的情况下,检索对象的唯一方法是从您的 url 获取关键字参数 slug 并在您的 Product slug 字段中搜索它,所以这里的查询是 slug=self.kwargs['slug']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 2013-06-06
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多