Django - 表单在提交时不保存

Django - Form not saving when submitted

大家下午好,

我的一个表单在提交时似乎没有保存。我不明白为什么,特别是因为我有一个类似的表格使用相同的代码工作得很好。

出于某种原因,使用管理面板它工作得很好。

我的假设是我遗漏了一些告诉表单需要保存的东西。但是找不到什么。

有什么想法吗?

型号

RATING=(
    (1,'1'),
    (2,'2'),
    (3,'3'),
    (4,'4'),
    (5,'5'),
)
class ProductReview(models.Model):
    user=models.ForeignKey(User, on_delete=models.CASCADE)
    product=models.ForeignKey(Product,related_name="comments", on_delete=models.CASCADE)
    review_text=models.TextField(max_length=250)
    review_rating=models.IntegerField(choices=RATING,max_length=150, default=0)
    date_added = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

观看次数

def add_review(request, product_id):
    product = Product.objects.get(pk=product_id)
    form = ReviewAdd(request.POST or None, instance=product) #instance=product (populate field with existing information)
    if form.is_valid():
        form.save()
        return redirect('product')
    return render(request, 'main/add_review.html',{'form':form}) 

URL

from django.urls import path
from . import views

urlpatterns = [
...
path('product/add_review/<product_id>', views.add_review,name="add_review"),
]

表格

class ReviewAdd(forms.ModelForm):
    class Meta:
        model = ProductReview
        fields = ('review_text', 'review_rating')
        labels ={
            'review_text': '',
            'review_rating': '',
                }

        widgets = {
                    'review_text': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Enter Review'}),
                    }

管理员

from django.contrib import admin
from .models import Venue, User, Product, ProductReview
from django.urls import path


admin.site.register(User)
admin.site.register(ProductReview)


class ProductReview(admin.ModelAdmin):
    list_display=['user','product','review_text','get_review_rating']

HTML页数

{% extends 'main/base.html' %}
{% load crispy_forms_tags %}

{% block title %} 
{% endblock %}

{% block content %}
    <center>
        <h1>Add ReviewTo Database</h1>
        <br/><br/>
        
        {% if submitted %}
            Success!
        {% else %}
                <form action="" method="post">
                {% csrf_token %}
                {{ form|crispy }}
                <input type="Submit" value="Submit" class="btn btn-secondary">
                </form>
        {% endif %}
    </center>
{% endblock %}

我检测到 2 个修复程序

在您的 url 上,参数 product_id 可能需要它将要接收的数据类型

path('product/add_review/<int:product_id>', views.add_review,name="add_review"),

并且在您看来,您正在发送一个实例,并且没有新评级的数据。 在您看来:


from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404


@login_required
def add_review(request, product_id):
    product = get_object_or_404(Product, pk=product_id)
    form = ReviewAdd(request.POST or None)
    if form.is_valid():
        new_rating = form.save(commit=False)
        new_rating.product = product
        new_rating.user = request.user
        new_rating.save()
        return redirect('product')
    return render(request, 'main/add_review.html',{'form':form})