Django:将DetailView与表单相结合

时间:2018-05-30 06:59:12

标签: django

我目前正在处理以下情况。我有一个DetailView,它基于来自数据库的URL slug get数据。

我目前正在努力解决的问题是如何将ModelForm添加到此DetailView中。表单将显示不同的票证类型,然后用户可以选择他想要的数量,然后单击继续进入结帐页面(票务预订平台)。选择将保存在ReservedItems模型下的数据库中。

或者是否有更好的方法来创建CreateView并将DetailView数据加载到其中?我有点困惑什么方法是最好的,以及如何做到这一点。你能帮助我吗?

这是一张图片应该是什么样的(目前还没有实用): enter image description here

当前views.py

class EventDetailView(DetailView):

    context_object_name = 'event'

    def get_object(self):
        organiser = self.kwargs.get('organiser')
        event = self.kwargs.get('event')
        queryset = Event.objects.filter(organiser__slug=organiser)
        return get_object_or_404(queryset, slug=event)

模板:

<h1>{{ event.name }}</h1>

<small class="text-muted">
    <em>Presented by <a href="{{ event.organiser.get_absolute_url }}">{{ event.organiser.name }}</a></em>
</small>

<div class="card mt-3">
    <div class="card-body">
        Short description: {{ event.short_description }}
    </div>
</div>

<div class="container mt-5">
    <form action="{% url 'checkout:reserve_ticket' %}" method="post">
        {% csrf_token %}
        {{ form }}

        <button type="submit" class="btn btn-primary">Continue</button>
    </form>  
</div>

models.py

class ReservedItem(models.Model):
    order_reference = models.CharField(
        max_length=10,
        unique=True
    )
    ticket = models.ForeignKey(
        Ticket,
        on_delete=models.PROTECT,
        related_name='reserved_tickets'
    )
    ticket_name = models.CharField(max_length=100)
    quantity = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

1 个答案:

答案 0 :(得分:0)

DetailView不应该限制您的视图能够执行的行为。您可以通过覆盖get_context_data来添加表单到DetailView:

def get_context_data(self, **kwargs):
    context = super(EventDetailView, self).get_context_data(**kwargs)
    context['form'] = MyFormClass
    return context

在此之后,您可以覆盖post方法来处理表单提交逻辑。

您是否使用CreateView或DetailView取决于您。您可能会发现CreateView更方便您实现的功能。