我目前正在处理以下情况。我有一个DetailView,它基于来自数据库的URL slug get数据。
我目前正在努力解决的问题是如何将ModelForm添加到此DetailView中。表单将显示不同的票证类型,然后用户可以选择他想要的数量,然后单击继续进入结帐页面(票务预订平台)。选择将保存在ReservedItems模型下的数据库中。
或者是否有更好的方法来创建CreateView并将DetailView数据加载到其中?我有点困惑什么方法是最好的,以及如何做到这一点。你能帮助我吗?
当前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)
答案 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更方便您实现的功能。