问: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