首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:子模型编辑注释无效

Django:子模型编辑注释无效
EN

Stack Overflow用户
提问于 2022-06-26 17:25:03
回答 1查看 84关注 0票数 0

当我按下模板中的编辑注释时,我的编辑注释出现了问题,没有错误,但是被重定向到同一页的顶部。有人知道我怎样才能让它让我编辑评论吗?

这篇文章只编辑了所需的代码,我修复了之前的删除注释,这样代码就被删除了.

这是我的代码:

views.py:

代码语言:javascript
复制
from django.shortcuts import render, redirect, reverse, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.db.models import Q
from django.db.models.functions import Lower

from .models import Product, Category, Review
from .forms import ProductForm, ReviewForm




def product_detail(request, product_id):
    product = get_object_or_404(Product, pk=product_id)
    if request.method == 'POST':
        rating = request.POST.get('rating', 3)
        content = request.POST.get('content', '')
        Review.objects.create(
            product=product,
            rating=rating,
            content=content,
            created_by=request.user
        )
        # redirect to the same page
        return redirect('product_detail', product_id=product_id)

    reviews = Review.objects.filter(product=product)
    context = {
        'product': product,
        'reviews': reviews
    }
    return render(request, 'products/product_detail.html', context)





 @login_required
def edit_review(request, review_id):
    """
    Saves review form edited by user
    """
    review = get_object_or_404(Review, pk=review_id)
    product = Product.objects.get(name=review.product)
    if request.method == 'POST':
        review_form = ReviewForm(request.POST or None, instance=review)
        if review_form.is_valid():
            review_form.save()
            messages.success(request, 'Successfully updated product!')
            return redirect(reverse('product_detail', args=[product.id]))

        # Success message if added
        messages.success(request, 'Thank You! Review was edited')
    else:
        # Error message if form was invalid
        messages.error(request, 'Something went wrong. '
                                'Make sure the form is valid.')

    form = ReviewForm(instance=review)
    messages.info(request, f'You are editing {review_id}')

    template = 'products/edit_review.html'
    context = {
        'form': form,
        'product': review,
    }
    return redirect(reverse('product_detail', args=[product.id]))

models.py:

代码语言:javascript
复制
from django.db import models
from django.contrib.auth.models import User





class Review(models.Model):
    product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE)
    rating = models.IntegerField(default=3)
    content = models.TextField()
    created_by = models.ForeignKey(User, related_name='reviews', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

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

urls.py:

代码语言:javascript
复制
from django.urls import path
from . import views

urlpatterns = [
    path('', views.all_products, name='products'),
    path('<int:product_id>/', views.product_detail, name='product_detail'),
    path('add/', views.add_product, name='add_product'),
    path('edit/<int:product_id>/', views.edit_product, name='edit_product'),
    path('delete/<int:product_id>/', views.delete_product, name='delete_product'),
    path('delete_review/<int:review_id>/delete_review', views.delete_review, name='delete-review'),
    path('edit_review/<review_id>', views.edit_review, name="edit_review"),
]

forms.py:

代码语言:javascript
复制
from django import forms
from .widgets import CustomClearableFileInput
from .models import Product, Category, Review




class ReviewForm(forms.ModelForm):
    class Meta:
        model = Review
        fields = ('content', 'rating')
        widgets = {
            'content': forms.Textarea(attrs={'class': 'form-control'}),
            'rating': forms.Select(attrs={'class': 'form-control'}),
        }

edit_review.html模板

代码语言:javascript
复制
{% extends "base.html" %}
{% load static %}


{% block content %}
    <div class="overlay"></div>
    <div class="container">
        <div class="row">
            <div class="col-12 col-md-6">
                <hr>
                <h2 class="logo-font mb-4">Reviews</h2>
                <h5 class="text-muted">Edit you're Review</h5>
                <hr>
            </div>
        </div>

        <div class="row">
            <div class="col-12 col-md-6">
                <form method="POST" action="{% url 'edit_review' review.id %}" class="form mb-2" enctype="multipart/form-data">
                    {% csrf_token %}
                    {% for field in form %}
                        {% if field.name != 'image' %}
                            {{ field | as_crispy_field }}
                        {% else %}
                            {{ field }}
                        {% endif %}
                    {% endfor %}
                    <div class="text-right">
                        <a class="btn btn-outline-black rounded-0" href="{% url 'reviews' %}">Cancel</a>
                        <button class="btn btn-black rounded-0" type="submit">Update Review</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
{% endblock %}
EN

回答 1

Stack Overflow用户

发布于 2022-06-26 20:55:24

对于delete视图中的第一个问题,必须引用带有大写Review的模型

代码语言:javascript
复制
@login_required
def delete_review(request, review_id):
    review = Review.objects.filter(review_id).last()

对于第二个问题,您可以从Here看到有关此错误的详细信息以及如何处理该错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72763767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档