【问题标题】:Django Model and Form for Comment system用于评论系统的 Django 模型和表单
【发布时间】:2021-08-24 20:28:55
【问题描述】:

我在我的书下建立了一个评论系统,只有经过身份验证的用户才能发表评论。当我使用表单添加评论时,它不起作用!为什么?

这是我的模型

models.py

​​>
class Books(models.Model):
    author = models.ManyToManyField(Authors)
    title = models.CharField(max_length=250)
    number_of_pages = models.PositiveIntegerField(validators=[MaxValueValidator(99999999999)])
    date_added = models.DateField(auto_now_add=True)
    updated = models.DateField(auto_now=True)
    publication_date = models.PositiveIntegerField(default=current_year(), validators=[MinValueValidator(300),
                                                                                       max_value_current_year])
    cover = models.ImageField(upload_to='pics/covers/', default='pics/default-cover.jpg')
    pdf_file = models.FileField(upload_to='pdfs/books/', default='pdfs/default-pdf.pdf')
    category = models.ForeignKey(Categories, on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Comments(models.Model):
    book = models.ForeignKey(Books, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{} - {}'.format(self.livre.title, self.user)

这是我的表格

forms.py

​​>
class BookForm(ModelForm):
    class Meta:
        model = Books
        fields = '__all__'


class CommentForm(ModelForm):
    class Meta:
        model = Comments
        fields = ['body']

这是我的看法

views.py

​​>
@login_required(login_url='login')
def book_detail_view(request, book_id):
    books = get_object_or_404(Books, pk=book_id)

    context = {'books': books,}

    return render(request, 'book_detail.html', context)

@login_required(login_url='login')
def add_comment(request, comment_id):
    form = CommentForm()
    books = get_object_or_404(Books, pk=comment_id)
    user = request.user

    if request.method == "POST":
        form = CommentForm(request.POST, instance=books)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.user = user
            comment.books = books
            comment.save()
            return redirect('book_detail', books.id)

    context = {'form': form}

    return render(request, 'comment_form.html', context)

这是我的书详情页

book_detail.html

{% extends 'base.html' %}

{% block title %} {{ books.title }} {% endblock %}

{% block content %}


<div class="row">
    <div class="col-lg-4">
        <p><img src="{{ books.cover.url }}"></p>
    </div>
    <div class="col-lg-8">
        <h2>{{ books.title }}</h2>
        <b>Author : </b>
        {% for author in books.author.all %}

            <a href="{% url 'detail_author' author.id %}">{{ author.name }}</a>
            {% if not forloop.last %},{% endif %}

        {% endfor %}<br/>

        <b>Catégory : </b>{{ books.category }}<br/>
        <b>Pages : </b>{{ books.number_of_pages }}<br/>
        <b>Publication : </b>{{ books.publication_date }}<br/>
        <b>Date added : </b>{{ books.date_added }}<br/>
        <b>Updated : </b>{{ books.updated }}<br/>
    </div>
</div>


<div class="row">
    <div class="col-lg-12">
        <p><a href="{{ books.pdf_file.url }}"><button class="btn btn-outline-dark btn-sm"><i class="far fa-eye"></i> Read</button></a></p>
    </div>
</div>

<hr/>

<div class="container-fluid">

    <h2>Comments</h2>

</div>

<div class="container-fluid">

    {% if not books.comments.all %}
        <p>No comments yet ! <a class="text-primary" href="{% url 'add_comment' books.id %}">Add comment...</a></p>

    {% else %}
        <a class="text-primary" href="{% url 'add_comment' books.id %}">Add comment !</a><br/><br/>
        {% for comment in books.comments.all%}
            <b>{{ comment.user }}</b> - <span class="text-muted" style="font-size: 13px;">{{ comment.date }}</span>
            <p>{{ comment.body }}</p>
        {% endfor %}

    {% endif %}

</div>

{% endblock %}

这是我的评论模型表格

comment_form.html

{% extends 'base.html' %}

{% block title %} Add a comment {% endblock %}

{% block content %}

    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Add this comment</button>
    </form>

{% endblock %}

这是我的网址

urls.py

​​>
urlpatterns = [
    # BOOKS
    path('book/<int:book_id>/', views.book_detail_view, name='book_detail'),

    # COMMENTS
    path('book/<int:comment_id>/comment/', views.add_comment, name='add_comment'),

]

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    您的表单当前设置为编辑这本书,而不是评论,您应该删除instance=books

    if request.method == "POST":
        #        no instance=books &downarrow;
        form = CommentForm(request.POST)

    如果你使用instance=books,表单会为Books对象设置属性,然后comment = form.save(commit=False)会导致comment是一个Books对象,它已经被保存并因此更新在数据库中。

    您在设置Comments 对象的book 时也打错了:它是book,而不是books

    if form.is_valid():
        comment = form.save(commit=False)
        comment.user = user
        comment.book = books  # &leftarrow; .book, not .books
        comment.save()

    注意:通常 Django 模型被赋予一个单数名称,所以Book而不是Books

    【讨论】:

    • 如果我删除instance=books,它会显示IntegrityError。如果我同时删除 instance=bookscommit=false 它会显示相同的错误!
    • 如果在 forms.py 我在 fields 中添加 book,它可以工作,但我不想要它!我希望用户只输入评论的正文,并将其直接分配给相关书籍
    • @fulldropi:你打错了,是comment.book = books,不是comment.books = ...
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 2018-05-24
    • 2011-10-13
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多