Django:将参数传递给管理员中的表单

时间:2018-05-05 10:32:22

标签: python django

我有两个名为EventRegistration的模型。每个Registration都将ForeignKey作为Event对象。

现在,在我的网络应用程序中,我提供RegistrationForm,以便人们可以注册参加活动。

示例:用户可以在/event/<pk>/register/注册。从URL我得到用户想要注册的事件,并将事件的公钥传递给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)

当然,在表单I中,不要显示事件字段(这样就排除了它的原因)。因为当用户在例如/event/5/register/很明显,他希望注册活动5

在视图中,我使用form = RegistrationForm(pk=pk)创建表单。

如果你知道如何解决这个问题的更好的解决方案,请提出它。 :)

现在出现问题:

在我的RegistrationForm中,我还有一些验证逻辑,当我在管理员中创建/编辑新的Registration对象时,我也希望获得这些验证。

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

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

    inlines = [RegistrationInline]
然而,事情是我的RegistrationForm确实需要事件的公钥,我不知道如何解决这个问题。我查看了Django文档,但作为初学者,我对许多方法和功能感到不知所措。

什么是好的解决方案?

这是我在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

0 个答案:

没有答案