我有两个名为Event
和Registration
的模型。每个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