Как установить ForeignKey в модели в зависимости от пули? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть форма регистрации на событие. Поскольку эта форма регистрации отображается как модальная при нажатии кнопки «Зарегистрироваться» на странице события, я знаю, на какое событие пользователь хочет зарегистрироваться. Но Джанго этого не делает, поскольку я не знаю, как реализовать это в коде.

У меня есть две модели: Participant и Event. Каждый экземпляр Participant ссылается на экземпляр 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 голосов
/ 25 марта 2019

Вам нужно установить его в form_valid. В этом случае get_context_data не был бы вызван, поэтому вам нужно получить событие снова; вы можете извлечь это в отдельный метод.

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