首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:将表单和模型组合起来生成表单

Django:将表单和模型组合起来生成表单
EN

Stack Overflow用户
提问于 2018-03-28 22:32:10
回答 1查看 430关注 0票数 1

我的Django表单存在问题,并将其与数据库中的数据结合在一起。

  1. 我需要获得有关票的数据,以便通过{%表示票证%}生成表单。
  2. 一旦用户选择了票证和数量,表单将检查此请求。我想使用Form.is_valid()和cleaned_data,但是,我无法将其与步骤1结合起来。

你们有什么建议或输入让我的代码更“安全”吗?目前,我跳过了Django提供的与cleaned_data和is_valid()一起提供的所有安全性。原因是我不知道怎么做。

views.py

代码语言:javascript
运行
复制
from django.shortcuts import render

from .models import Ticket
from tickets.models import Order, Entry

# Create your views here.
def choose_ticket_and_quantity(request):

    tickets = Ticket.objects.all()

    if request.POST:
        o = Order.objects.create()
        request.session['order_id'] = o.order_id

        ticket_id = request.POST.getlist('ticket_id')
        ticket_quantity = request.POST.getlist('ticket_quantity')
        for x in range(len(ticket_id)):
            if int(ticket_quantity[x]) > 0:
                e = Entry(
                        order=Order.objects.get(order_id = o.order_id),
                        ticket=Ticket.objects.get(id = ticket_id[x]),
                        quantity=ticket_quantity[x]
                    ).save()

    return render(request, "tickets/choose_ticket_and_quantity.html", {"tickets": tickets})

models.py

代码语言:javascript
运行
复制
class Ticket(models.Model):
    description     = models.TextField()
    name            = models.CharField(max_length=120)
    price_gross     = models.DecimalField(max_digits=19, decimal_places=2)
    quantity        = models.IntegerField()

choose_ticket_and_quantity.html

代码语言:javascript
运行
复制
<form action="" method="post">
  {% csrf_token %}

  {% for ticket in tickets %}
    <input type="hidden" name="ticket_id" value="{{ ticket.id }}">

    {{ ticket.name }}

    <select name="ticket_quantity" >
      <option value="0">0</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>

  {% endfor %}

  <p><input type="submit" value="Checkout"></p>
</form>

这里是我目前在forms.py中尝试/启动的内容,但我不知道如何在从其模型中获取票证数据的同时呈现*.html。

代码语言:javascript
运行
复制
from django import forms

#Currently not used
INT_CHOICES = [tuple([x,x]) for x in range(0,11)]

class TicketForm(forms.Form):
    ticket_quantity     = forms.IntegerField(widget=forms.Select(choices=INT_CHOICES))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 12:28:58

您可以为您的EntryModelForm模型创建一个Entry,然后创建一个FormSet of EntryModelForm

Django Formset文档

下面是示例视图函数:

代码语言:javascript
运行
复制
from django.forms import formset_factory

def choose_ticket_and_quantity(request):

    tickets = []
    for ticket in Ticket.objects.all():
        tickets.append({'ticket': ticket})

    EntryFormSet = formset_factory(EntryModelForm, extra=0)
    formset = EntryFormSet(initial=tickets)

    if request.POST:
        o = Order.objects.create()

        formset = EntryFormSet(request.POST, initial=tickets)
        for form in formset:
            if form.is_valid():
                entry = form.save(commit=False)
                entry.order = o
                entry.save()

    return render(request, "tickets/choose_ticket_and_quantity.html",
                  {'formset': formset})

我想您的入门模型类可能如下所示:

代码语言:javascript
运行
复制
class Entry(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
    quantity = models.IntegerField(choices=INT_CHOICES)

以下是表单类:

代码语言:javascript
运行
复制
class EntryModelForm(forms.ModelForm):
    class Meta:
        model=Entry
        exclude = ('order',)

下面是HTML模板:

代码语言:javascript
运行
复制
<form action="" method="post">
  {% csrf_token %}
  {{ formset }}
  <p><input type="submit" value="Checkout"></p>
</form>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49545218

复制
相关文章

相似问题

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