Django表格和从模型渲染数据 [英] Django form & rendering data from model

查看:166
本文介绍了Django表格和从模型渲染数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用Django表单。基于票证模型,我生成此表单集,用户可以在其中选择所需的票证数量。将它们重定向到结帐页面后。

I am currently struggling with Django forms. Based on the tickets model I generate this formset where users can choose the qty of tickets they want. After they will be redirected to the checkout page.

我的问题是,当我使用{{form.ticket}}时,我得到一个选择字段,但这不是我想要的。我在寻找。我只想打印出下面的屏幕快照中所示的票证。

My problem is, when I use {{ form.ticket }} I get a select field but that's not what I'm looking for. I just want to print out the tickets as seen in the screenshot below.

有人可以帮我吗?

应如何设置:

如何当前看起来像这样:

How it currently looks like:

views.py

from django.forms import formset_factory
from django.shortcuts import redirect, render

from .forms import EntryModelForm
from .models import Ticket
from orders.models import Order, Entry

# Create your views here.
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()
        request.session['order_id'] = o.order_id

        formset = EntryFormSet(request.POST, initial=tickets)

        if formset.is_valid():
            for form in formset:
                if form.cleaned_data['quantity'] > 0:
                    entry = form.save(commit=False)
                    entry.order = o
                    entry.save()

            return redirect('http://127.0.0.1:8000/checkout')

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

forms.py

from django import forms

from orders.models import Entry

class EntryModelForm(forms.ModelForm):

    class Meta:
        model=Entry
        fields = ['ticket', 'quantity']

choose_ticket_and_quantity.html

choose_ticket_and_quantity.html

<form method="post" action="">
    {% csrf_token %}
    {{ formset.management_form }}

    {% for form in formset %}
        <ul>
            <li>{{ form.ticket }}</li>
            <li>{{ form.quantity }}</li>
        </ul>

    {% endfor %}

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

我也在这里尝试过,但是不幸的是,由于我的表单无法完成,不再经过验证,所有票证类型均已打印在一起:

What I also tried was this here, but unfortunately, this didn't work either as my form couldn't be validated anymore and all ticket types have been printed together:

{% for choice in form.ticket.field.choices %}
{{choice.1}}
{% endfor %}


推荐答案

尝试一下

在应用程序/中添加模板标签 get_ticket.py templatetags(也添加 __ init __。py

Add a templatetag get_ticket.py in app/templatetags (Add a __init__.py too)

from django import template
register = template.Library()
# import Ticket model

@register.simple_tag
def get_ticket(pk):
    ticket = Ticket.objects.get(pk=int(pk))
    return ticket.name # is it name?

在您的模板中

{% load get_ticket %}
<form method="post" action="">
    {% csrf_token %}
    {{ formset.management_form }}
    <ul>
    {% for form in formset %}
        <li>
            <strong>{% get_ticket form.ticket.value %}</strong><br>
            <input type="hidden" name='{{form.ticket.name}}' value='{{form.ticket.value}}'>
            {{ form.quantity }}
        </li>
    {% endfor %}
    </ul>
    <p><input type="submit" value="Checkout"></p>
</form>

这篇关于Django表格和从模型渲染数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆