首页 > 解决方案 > Django: Pass parameter to Form in Admin

问题描述

I have two models called Event and Registration. Each Registration has as ForeignKey an Event object.

Now, in my web application I provide a RegistrationForm so that people can register for an event.

Example: A user can register at /event/<pk>/register/. From the URL I get the event the user would like to register for and pass the public key of the event to the RegistrationForm.

class RegistrationForm(forms.ModelForm):

    class Meta:
        model = Registration
        exclude = ['event']

    def __init__(self, *args, **kwargs):
        self.event = kwargs.pop('pk')
        super().__init__(*args, **kwargs)

In the form I, of course, do not display the event field (so that's why it's excluded). Because when the user is at e.g. /event/5/register/ is clear that he would like to register for event 5.

In the view I create the Form using form = RegistrationForm(pk=pk).

In case you know a better solution how to solve this, please come up with it. :)

Now the problem:

In my RegistrationForm I have also some validation logic and when I create/edit a new Registration object in the Admin, I'd also like to have those validations.

class RegistrationInline(admin.StackedInline):
    model = Registration
    extra = 0
    form = RegistrationForm

@admin.register(Event)
class EventAdmin(admin.ModelAdmin):
    form = EventForm

    inlines = [RegistrationInline]

Thing is, however, that my RegistrationForm does need the public key of the event and I do not know how to solve that problem. I looked at the Django documentation, but I am overwhelmed about the many methods and functionality as a beginner.

What is a good solution?

Here my validations in the RegistrationForm:

def clean_number_of_tickets(self):
    number_of_tickets = self.cleaned_data.get('number_of_tickets')
    # Event object
    event = Event.objects.get(pk=self.event)

    if self.instance.number_of_tickets:
        available = self.instance.number_of_tickets + event.get_number_of_available_tickets()
    else:
        available = event.get_number_of_available_tickets()
    if number_of_tickets > available:
        raise ValidationError()

    return number_of_tickets

标签: pythondjango

解决方案


推荐阅读