Есть ли в модели django поля, которые пользователь не заполняет, но заполняет компьютер? (CS50 Проект 2)

Я создал форму на django, которая создает и сохраняет комментарии к объявлениям. Я хочу, чтобы комментарий сохранялся только в том объявлении, к которому он был прокомментирован (сейчас он сохраняется во всех объявлениях). Есть ли способ указать веб-странице, в какое объявление сохранить комментарий и какой пользователь написал комментарий?

models.py

class Comments(models.Model):
    comment = models.CharField(max_length=500)

views.py

@login_required(login_url='login')
def listing(request, id):
    listing = Listings.objects.get(id=id)
    form = CommentForm
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save()
            comment.save()
        else:
            return render(request, "auctions/listing.html",{
               "auction_listing": listing,
               "form": form,
               "comments": Comments.objects.all() 
               })
    return render(request, "auctions/listing.html",{
        "auction_listing": listing,
        "form": form,
        "comments": Comments.objects.all()
    })

html

<img src ="{{ auction_listing.image }}" style = "height: 10%; width: 10%;">
    <h4 class = "text">{{ auction_listing.title }}</h4>
    <h6>Description: {{ auction_listing.description }}</h6>
    <h6>Category: {{ auction_listing.category }}</h6> 
    <h6>Price: ${{ auction_listing.bid }}</h6>

    <form action = "{% url 'listing' auction_listing.id %}" method = "POST">
        {% csrf_token %}
        {{ form }}
        <input type = "submit" value = "Save">
    </form>

    {% for comment in comments %}
        <h6> {{ comment.comment }} </h6>
    {% endfor %}

Спасибо за помощь!

Я хочу, чтобы комментарий сохранялся только в том листинге, к которому он прокомментирован - Чтобы сохранить комментарий в текущем или конкретном листинге, необходимо создать связь между комментарием и листингом.

Обновите свою модель комментариев следующим образом

class Comments(models.Model):
    listing = models.ForeignKey(Listings, on_delete=models.CASCADE) # for one-to-many relation
    comment = models.CharField(max_length=500)

и при сохранении формы передать объект листинга, а при рендеринге отфильтровать его с текущим листингом

@login_required(login_url='login')
def listing(request, id):
    listing = Listings.objects.get(id=id)
    comment_obj = Comments.objects.filter(listing=listing) 
    form = CommentForm() # you have to initialize form properly
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.listing = listing
            comment.save()
        else:
            return render(request, "auctions/listing.html",{
               "auction_listing": listing,
               "form": form,
               "comments": comment_obj
               })
    return render(request, "auctions/listing.html",{
        "auction_listing": listing,
        "form": form,
        "comments": comment_obj
    })

Предлагаю посмотреть ForeignKey.related_name

Было бы полезно получить больше информации о классе модели Listing, а также о классе CommentForm. Возможно, в классе CommentForm есть что-то, что заставляет его быть связанным со всеми листингами. Также похоже, что у вас есть ForiegnKey в вашей модели Listing, который указывает на ваш комментарий. Было бы лучше поступить, как предложил Анкит Тивари, и связать комментарий с объявлением, чтобы несколько комментариев могли указывать на одно и то же объявление.

Вернуться на верх