python - 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
解决方案
推荐阅读
- material-ui - 在 Material-UI 中 $active 是什么意思?
- axapta - Dynamics 365 Finance 无法关闭当前表单 x++
- javascript - 在 MainActivity.java 中找不到 REACT-NATIVE 的方法 getPackages()
- swift - SwiftUI:如何更改 Slider 的范围?
- css - 禁用弹出背景滚动
- r - 在 R Shiny 中使用 renderUI 时,如何使我的 selectizeInput 持久化?
- android - 具有多个布局的 RecyclerView 未正确更新或在新数据上崩溃
- c# - c# XDocument.Root.Add 不添加任何元素
- c - 在 C 语言中使用宏是可移植的吗?
- python - 在 Python 中从 JSON 文件中提取数据