显示和处理Django表单

rlcwz9us  于 2023-03-31  发布在  Go
关注(0)|答案(1)|浏览(97)

我有某种在线商店。我需要它的工作,以便在点击购买按钮后,这是位于产品页面,用户被重定向到一个页面与结帐表单,其中包含的字段:电话号码、邮件和产品本身。
URLS.PY

from django.urls import path
from first.views import productsHTML, productHTML, products_category, product_buy

urlpatterns = [
    path("productsHTML/<str:uuid>/buy", product_buy, name = "product_buy"),
    path("products_category/<str:id_category>", products_category, name = "products_category"),
    path("productsHTML/<str:uuid>", productHTML, name = "productHTML"),
    path("productsHTML/", productsHTML, name = "productsHTML"),

]

FORMS.PY

class OrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['email', 'phone_number']
        widgets = {
            'email': forms.EmailInput(),
            'phone_number': forms.TextInput(),
        }

VIEWS.PY

def product_buy(request, uuid):
    if request.method == 'GET':
        product = Product.objects.get(id=uuid)
        form = OrderForm()
        return render(request, 'product_buy.html', {'product': product, 'form': form})

    if request.method == 'POST':
        try:
            if form.is_valid():
                product = Product.objects.get(id=uuid)
                email = form.cleaned_data['email']
                phone_number = form.cleaned_data['phone_number']
                order = Order.objects.create(email=email, product=product,phone_number=phone_number)
                return redirect('productsHTML')
        except:
            
            return render(request, 'productHTML.html', uuid = uuid)

我使用了一个构造try except,以便在创建订单的情况下,用户被重定向到包含所有产品的页面,并且在失败的情况下:到他想买的产品的页面。
PRODUCT_BUY.HTML

{% extends 'products.html' %}
{% block title %}Оформление заказа{% endblock %}
{% block content %}
    <h1>Оформление заказа</h1>
    <form method="post" action = 'product_buy'>
        {% csrf_token %}
        {{ form.as_p }}
        <input type="Submit" name="submit" value="Купить"/>
    </form>
{% endblock %}

MODELS.PY

class Order(models.Model):

    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    email = models.EmailField(verbose_name='почта', null=True)
    phone_number = models.CharField(max_length=20, verbose_name='номер телефона')

表单似乎显示出来了,但是提交之后,订单并没有添加到数据库中。
我还注意到,按钮显示为“Поиск”,但我写了value=“Купить”。并且表单显示在一行中,但我写了{{form.as_p }}。下面附上一张照片。
我将很高兴为任何帮助!如果您需要更多的信息,我准备提供。谢谢。
image1

shyt4zoc

shyt4zoc1#

我相信当你提交表单时,你会得到一个404页面,显示没有找到匹配的url。这是因为你试图在Django中使用url的反向解析,但你没有在url名称中使用jinja标签。

{% extends 'products.html' %}
{% block title %}Оформление заказа{% endblock %}
{% block content %}
    <h1>Оформление заказа</h1>
    <form method="post" action = "{% url 'product_buy' <uuid_param_here> %}">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="Submit" name="submit" value="Купить"/>
    </form>
{% endblock %}

uuid_param_here =〉是需要在请求url中发送的参数。
{% url 'product_buy' someproduct %}相当于productsHTML/someproduct/buy
这里有一个类似问题的[链接] https://stackoverflow.com/a/42441122/10669512!。请检查。
另外,你的观点似乎不正确。因为你使用的是try/except,异常没有被正确处理。你没有在post条件中定义表单变量

if request.method == 'POST': # If the form has been submitted...
    form = OrderForm(request.POST) # A form bound to the POST data
    if form.is_valid():
        product = Product.objects.get(id=uuid)
        email = form.cleaned_data['email']
        phone_number = form.cleaned_data['phone_number']
        order = Order.objects.create(email=email, product=product,phone_number=phone_number)
        return redirect('productsHTML')

查看更多说明[链接] Django form is_valid() fails

相关问题