【问题标题】:Django use variable from view or url in forms.pyDjango在forms.py中使用视图或url中的变量
【发布时间】:2016-05-09 21:05:38
【问题描述】:

可以在 forms.py 中使用变量吗?我正在使用基于平台模型查询集的选择字段。我的 url 和 view 包含这个 id,但我不知道如何将它提供给 forms.py 到我的查询集。

forms.py:

class OrderCreateForm(forms.ModelForm):
    platform = forms.CharField(choices=Platform.objects.filter(client_id=variable_from_view_or_url).values_list('id', 'name').order_by('id'))

    class Meta:
        model = Order
        fields = ('price', 'deadline', 'finished', 'client', 'platform')

view.py:

@user_passes_test(lambda u: u.is_staff, login_url='/account/login/')
def order_create(request, request_client_id):
    dict = {}

    dict['form_order'] = OrderCreateForm()
    return render(request, 'panel/order/form.html', dict)

【问题讨论】:

    标签: django django-forms django-templates django-views


    【解决方案1】:

    是和不是。

    你不能这样做,但你可以在表单的 init 方法中定义选项

    def __init__(self, client_id, *args, **kwargs):
         super(OrderCreateForm, self).__init__(*args, **kwargs)
         self.fields['platform'].choices = Platform.objects.filter(client_id=client_id).values_list('id', 'name').order_by('id')
    

    然后用 id 调用它

    OrderCreateForm(request_client_id)
    

    【讨论】:

    • 注意,您也可以将其作为一个 kwarg 包含在内,然后仅在此 kwarg 存在时进行过滤,否则返回一系列默认选项。
    • 是的,这很好用,谢谢!我还有一个关于初始的问题。我有来自 quryset 的记录,但我想添加像“-”这样的首字母,或者只是空选择,但也在表单中。我尝试在 init (self.initial['platform'] = '-') 中设置初始值,但这不起作用:(
    • @BartoszPłóciennik - 不用担心,我想您的其他问题与 this 相同,但如果不是,您可能需要考虑提出新问题
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2011-04-12
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多