【问题标题】:How to use RelatedFieldWidgetWrapper in django 3如何在 django 3 中使用 RelatedFieldWidgetWrapper
【发布时间】:2020-10-22 20:08:08
【问题描述】:

我应该在 rel 和 admin 站点中添加什么? 这是我表单中的字段:

tutor_temporal = forms.ModelChoiceField(
    queryset=Tutor_temporal.objects.all(),
    label='Tutor No Registrado', 
    required=False,
    widget=RelatedFieldWidgetWrapper(
        widget=forms.Select(attrs={'class': 'input is-small is-rounded'}),
        rel=Tutor_temporal._meta.get_field('id').rel,
        admin_site= admin_site
    )
)

问题是,当我尝试这样做时,会抛出此 AttributeError: 'AutoField' object has no attribute 'rel',因为显然已被弃用。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:
    from django.contrib.admin import site as admin_site
    
    def __init__(self, *args, **kwargs):
            super(TesisForm, self).__init__(*args, **kwargs)
          
            self.fields['tutor_temporal'].widget = (
               RelatedFieldWidgetWrapper( 
                   self.fields['tutor_temporal'].widget,
                   self.instance._meta.get_field('tutor_temporal').remote_field,            
                   admin_site,
               )
           )
    
    

    【讨论】:

    • 虽然这给了我 + 按钮,但它在同一个窗口中打开,然后没有关闭“弹出窗口”,这不是真正的弹出窗口,因为它在同一个窗口中打开。你是如何克服这个问题的?
    • @HenryM 我遇到了同样的问题,请问你解决了吗?
    • 这很奇怪。你可以发布你的代码的粘贴 bien 吗?您使用的是哪个版本的 Django?你能在同一个窗口上贴一张截图吗?
    • @JoaquínDeTone 它的代码
    【解决方案2】:

    我被困在一个场景中,我覆盖了 ModelForm 中的一些字段:

    class VariationsForm(forms.ModelForm):
        """ Variations admin form """
    
        color = forms.ModelChoiceField(
            required=True,
            queryset=mdl.Color.objects.filter(
                is_active=True,),
            label='Color',
            empty_label="-----",
        )
        size = forms.ModelChoiceField(
            required=True,
            queryset=mdl.Size.objects.filter(
                is_active=True,),
            label='Talla / Medida',
            empty_label="-----"
        )
    

    并且“添加操作按钮”从来没有显示,所以我开始在网上搜索如何启用此功能,我发现通常所有生成的字段都被类包装: RelatedFieldWidgetWrapperhttps://github.com/django/django/blob/master/django/contrib/admin/widgets.py#L224,

    作为前面分享的解决方案的一部分,我将包装器应用于我早期覆盖的字段:

        from django.contrib.admin import (
          widgets,
          site as admin_site
        )
        .....
        .....
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # personalize choices
            for field in ["color", "size"]:
                self.fields[field].widget = widgets.RelatedFieldWidgetWrapper(
                    self.fields[field].widget,
                    self.instance._meta.get_field(field).remote_field,
                    admin_site
                )
    

    终于:

    最好的问候,

    【讨论】:

    • 我找这个已经一年了。非常感谢!
    • 我一直在查看您指出的代码,希望我能找到一种方法来更改单击 + 号时使用的 URL。我想去我自己的页面之一,而不是管理员。你知道怎么做吗?
    • 您好,抱歉耽搁了,您可以查看django admin tabularinline form methods,在那里您会找到一种可以让您更改按钮操作的方法。
    • @ManuelLazo 它在同一个窗口中打开,然后没有关闭实际上不是弹出窗口的“弹出窗口”,因为它在同一个窗口中打开。你是怎么克服的
    • @HunarMohammed,当新窗口打开时,如果我没记错的话,你有“添加”和“取消”按钮,对吧?点击取消按钮会关闭窗口?
    猜你喜欢
    • 2011-01-10
    • 2020-08-16
    • 2017-10-02
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2020-09-05
    • 2021-05-19
    • 2021-12-04
    相关资源
    最近更新 更多