【问题标题】:Django form & rendering data from model来自模型的 Django 表单和渲染数据
【发布时间】:2018-09-22 17:29:35
【问题描述】:

我目前正在努力处理 Django 表单。基于门票模型,我生成了这个表单集,用户可以在其中选择他们想要的门票数量。之后他们将被重定向到结帐页面。

我的问题是,当我使用 {{ form.ticket }} 时,我得到一个选择字段,但这不是我想要的。我只想打印出如下截图所示的门票。

谁能帮我解决这个问题?

应该如何:

目前的样子:

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

<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>

我在这里也尝试过,但不幸的是,这也不起作用,因为我的表单无法再验证,并且所有票证类型都已打印在一起:

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

【问题讨论】:

    标签: django forms django-forms formset


    【解决方案1】:

    试试这个

    在 app/templatetags 中添加一个模板标签get_ticket.py(也添加一个__init__.py

    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>
    

    【讨论】:

    • 嗨@Ramkishore M 感谢您的意见。使用隐藏域的方法是一个非常好的主意。然而,一件事不起作用的是 form.ticket.value 只给我返回数字(1、2 和 3)。
    • 嗨@Ramkishore M,太棒了,它现在显示了票名!我有最后一个问题。单击发送后,我收到以下错误消息: TypeError at /tickets/cart int() argument must be a string, a bytes-like object or a number, not 'NoneType' 我认为问题在于名称隐藏的领域?一旦我添加 {{ form.ticket }} POST 请求工作正常。你有什么主意吗?如何呈现 form.ticket 的示例:
    • 另一个更新:我现在删除了隐藏字段并再次添加了 {{ form.ticket }}。在我进入 forms.py 并将 form.ticket 小部件更改为 def init 中的 HiddenInput() 之后,这有效!这是一个好的解决方案吗?非常感谢您的帮助。现在我终于可以继续了。
    • @JonProgrammer,当然这听起来是最好的方法。我不知道 HiddenInput 小部件。我会记住这一点
    【解决方案2】:

    看起来你想显示字段的值:

    <li>{{ form.ticket.value }}</li>
    

    【讨论】:

    • 嗨,Ivan,我也试过了,但问题是我只能将数字作为值返回(1、2 和 3)。
    • 这有效吗? &lt;li&gt;{{ form.instance.get_ticket_display }}&lt;/li&gt;
    • 不,很遗憾没有。感谢您尝试帮助我!
    • 你知道为什么 {{ form.instance.get_ticket_display }} 在这里不起作用吗?我阅读了有关它的文档,似乎可以这样写。但是它没有为我生成任何数据。
    • 选择字段不是 get_ticket_display 吗?票是外键吧?
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多