如何根据子弹在模型中设置ForeignKey?

时间:2019-03-25 12:53:20

标签: django django-models django-forms django-views

我有一个活动的注册表。由于单击事件页面上的“注册”按钮时,此注册表单显示为模式,因此我知道用户想要注册哪个事件。但是Django没有,因为我不知道如何在代码中实现。

我有两个模型:ParticipantEventParticipant的每个实例通过Event引用一个ForeignKey实例。如何根据事件页面的提示设置ForeignKey

这是我的代码示例:

models.py:

from django.db import models

class Event(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=500)
    #<...>
    slug = models.SlugField()

class Participant(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()
    event = models.ForeignKey(Event, on_delete=models.CASCADE)

forms.py:

from django.forms import ModelForm

from .models import Participant

class ParticipantForm(ModelForm):
    class Meta:
        model = Participant
        fields =  ['name', 'email']

views.py:

from django.template.loader import render_to_string
from django.views import generic

from .models import *
from .forms import *

class RegistrationView(generic.FormView):

    template_name = 'me/registration.html'
    form_class = ParticipantForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['event'] = Event.objects.get(slug=self.args[0])
        return context

    def form_valid(self, form):
        form.save()
        return HttpResponse(render_to_string('me/registration-complete.html', {'event': Event.objects.get(slug=self.args[0])}))

1 个答案:

答案 0 :(得分:0)

您需要在form_valid中进行设置。在这种情况下,get_context_data不会被调用,因此您需要再次获取该事件。您可能希望将其提取到单独的方法中。

def form_valid(self, form):
    form.instance.event = Event.objects.get(reference_name=self.args[0])
    form.save()
    return ...