问:Django 脆皮表格 - 根据 url 更改行为
Q: Django crispy forms - change behavior depending url
我不知道如何用 django crispy forms 实现这个。
我有一个像这样的 URL 接口:
myurl.com/movements/new
而且我有一个 select 形式的运动类型。
当没有明确指定的移动类型时,只显示 select 而没有任何选项 selected.
当用户访问带有 URL 的表单时,例如 myurl.com/movements/income/
我希望此 select 默认具有 income
选项。
依此类推。
我知道我可以为此使用 JavaScript,但我认为将它放在后端会更好。
我怎样才能在后端实现这个?
models.py
:
class MyModel(models.Model):
CHOICES = (
('Income', 'Income'),
('Option2', 'Option2'),
('Option3', 'Option3'),
)
choice = models.CharField(max_length=25, choices=CHOICES)
urls.py
:
urlpatterns = [
url(
regex=r'^new/(?P<option>[\w.@+-]+)/$', # feel free to adjust the regex
view=views.NewCreateView.as_view(),
name='new'
),
url(
regex=r'^new/$',
view=views.NewCreateView.as_view(),
name='new'
)
]
views.py
:
class NewCreateView(CreateView):
model = MyModel
fields = ['choice']
def get_form_kwargs(self):
form_kwargs = super().get_form_kwargs()
if 'option' in self.kwargs:
if any(self.kwargs['option'] in choice for choice in MyModel.CHOICES):
form_kwargs['initial']['choice'] = self.kwargs['option']
return form_kwargs
仅当您访问 URL new/
时使用 new/Income
等有效选项,才会给出 drop-down 列表的初始选择。当然,您可以根据需要调整URL。
您也可以覆盖 get_initial
而不是 get_form_kwargs
。
我不知道如何用 django crispy forms 实现这个。
我有一个像这样的 URL 接口:
myurl.com/movements/new
而且我有一个 select 形式的运动类型。
当没有明确指定的移动类型时,只显示 select 而没有任何选项 selected.
当用户访问带有 URL 的表单时,例如 myurl.com/movements/income/
我希望此 select 默认具有 income
选项。
依此类推。
我知道我可以为此使用 JavaScript,但我认为将它放在后端会更好。
我怎样才能在后端实现这个?
models.py
:
class MyModel(models.Model):
CHOICES = (
('Income', 'Income'),
('Option2', 'Option2'),
('Option3', 'Option3'),
)
choice = models.CharField(max_length=25, choices=CHOICES)
urls.py
:
urlpatterns = [
url(
regex=r'^new/(?P<option>[\w.@+-]+)/$', # feel free to adjust the regex
view=views.NewCreateView.as_view(),
name='new'
),
url(
regex=r'^new/$',
view=views.NewCreateView.as_view(),
name='new'
)
]
views.py
:
class NewCreateView(CreateView):
model = MyModel
fields = ['choice']
def get_form_kwargs(self):
form_kwargs = super().get_form_kwargs()
if 'option' in self.kwargs:
if any(self.kwargs['option'] in choice for choice in MyModel.CHOICES):
form_kwargs['initial']['choice'] = self.kwargs['option']
return form_kwargs
仅当您访问 URL new/
时使用 new/Income
等有效选项,才会给出 drop-down 列表的初始选择。当然,您可以根据需要调整URL。
您也可以覆盖 get_initial
而不是 get_form_kwargs
。