Home > Mobile >  how can i use django comment_set.all
how can i use django comment_set.all

Time:05-24

My problem

Make comment model, and form for Django

Use {% for i in post.comment_set.all %}

no change html

Information saved in the comment form does not appear

how can i fix it?

MY top_detail.html

<form method="POST" action="{% url 'create_comment' post.id %}">
        {% csrf_token %}
        {{ comment_form }}
        <input type="submit">
        {% for i in post.comment_set.all %}
        <p>comment: {{ i.subject }}</p>
        <p>time: {{ i.created_at }}</p>
        <hr>
        {% endfor %}
    </form>

MY models.py

from django.db import models

class Top(models.Model):
    product_name = models.CharField(blank=True, null=True, max_length=30)
    product_price = models.CharField(blank=True, null=True, max_length=30)
    product_image = models.ImageField(blank=True, null=True, upload_to="images")
    product_explain = models.TextField(blank=True, null=True, )

class Question(models.Model):
    post = models.ForeignKey(Top, null=True, on_delete=models.CASCADE)
    subject = models.CharField(null=True, max_length=150)
    created_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.subject

MY urls.py

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
from .views import PostList

urlpatterns = [
    path('home/', views.home, name='home'),
    path('home/top', PostList.as_view(), name='top'),
    path('home/top/<int:pk>/', views.top_detail, name='top_detail'),
    path('search/', views.search, name='search'),
    path('signup/', views.signup, name='signup'),
    path('login/', auth_views.LoginView.as_view(template_name='main/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('create_comment/<int:post_id>', views.create_comment, name='create_comment'),
]

My views.py

def top_detail(request,pk):
    post = get_object_or_404(Top, pk=pk)
    post_list = Top.objects.get(pk=pk)
    comment_form = CommentForm()
    return render(request, 'main/top_detail.html', {'post':post, 'post_list':post_list,'comment_form':comment_form})

def create_comment(request, post_id):
    filled_form = CommentForm(request.POST)
    if filled_form.is_valid():
        form = filled_form.save(commit=False)
        form.post = Top.objects.get(id=post_id)
        form.save()

    return redirect('top_detail',post_id)

MY forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Question

        fields = ('subject',)

Should the pk parts of top_detail and create_comment (request, post_id) in VIEWS.py be the same?

CodePudding user response:

You are mixing names. If you name something Question, don't call it by Comment. Same thing with Post and Top. It matters for your code.

For now, you have to use:

{{ post.question_set.all }}

But if I were you I would change naming, because it seems even you don't understand how it works :)

Like:

class Post(models.Model):
    ...

class Comment(models.Model):
    post = models.ForeignKey(Post, null=True, on_delete=models.CASCADE)
    ...

then in template:

{{ post.comment_set.all }}
  • Related