简体   繁体   English

如何覆盖或隐藏 Django 管理模型表单字段值

[英]How to Override or Hide Django admin model form field value

Currently, I'm having a problem when overriding a form field value on my (Django==4.0.3) django admin form.目前,在我的 (Django==4.0.3) django 管理表单上覆盖表单字段值时遇到问题。 The objective is : I have a specific user table that I'm connecting to AWS Cognito.目标是:我有一个要连接到 AWS Cognito 的特定用户表。 And when the admin creates a new user in django, the system must create a request to create a new Cognito user.并且当管理员在 django 中创建一个新用户时,系统必须创建一个请求来创建一个新的 Cognito 用户。 Once the Cognito user is created it generates a "sub" code, and then the sub should be saved in django创建 Cognito 用户后,它会生成一个“子”代码,然后应将子代码保存在 django 中

Code Follows代码如下

Model模型

class BuyerUser(BaseModel):
   buyer = models.ForeignKey(
       Buyer, on_delete=models.RESTRICT, related_name="%(class)s_buyer"
)
   cognito_sub = models.CharField(max_length=50)
   given_name = models.CharField(max_length=50)
   family_name = models.CharField(max_length=50)
   preferred_username = models.CharField(max_length=50)
   email = models.EmailField(blank=False)
   terms_conditions_accepted_datetime = models.DateTimeField(null=True, blank=True)

   def __str__(self):
       return self.preferred_username

admin行政

class BuyerUsers(admin.ModelAdmin):
   list_display = ('id', 'buyer', 'given_name', 'family_name', 'preferred_username', 'available')
   list_filter = ('buyer', 'available',)
   list_display_links = ('id', 'preferred_username',)
   search_fields = ('buyer__name', 'preferred_username', 'available')
   list_per_page = 20

   form = BuyerUserChangeForm
   add_form = BuyerUserAddForm  # It is not a native django field. I created this field and use it in get_form method.

   def get_form(self, request, obj=None, **kwargs):
       """
       Use special form during foo creation
       """
       defaults = {}
       if obj is None:
           defaults['form'] = self.add_form
       defaults.update(kwargs)
       return super().get_form(request, obj, **defaults)
   admin.site.register(BuyerUser, BuyerUsers)

and my forms和我的表格

class BuyerUserAddForm(forms.ModelForm):
   grupo = forms.CharField()

   def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
             initial=None, error_class=ErrorList, label_suffix=None,
             empty_permitted=False, instance=None, use_required_attribute=None,
             renderer=None):
      super().__init__(data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance,
                     use_required_attribute, renderer)
      self.cognito_sub = None


   def save(self, commit=True):
       grupo = self.cleaned_data.get('grupo', None)
       self.given_name = self.cleaned_data.get('given_name', None)
       self.family_name = self.cleaned_data.get('family_name', None)
       self.preferred_username = self.cleaned_data.get('preferred_username', None)
       self.email = self.cleaned_data.get('email', None)
       cognito = CognitoDriver()
       sub = cognito.parse_user(
        cognito.create_user(self.preferred_username, self.email)["User"]
    )["Sub"]

        self.cognito_sub = sub
        cognito.add_group(self.preferred_username, grupo)

        return super(BuyerUserAddForm, self).save(commit=commit)

   class Meta:
       model = BuyerUser
       # fields = '__all__'
       exclude = ['terms_conditions_accepted_datetime']


class BuyerUserChangeForm(forms.ModelForm):
    class Meta:
        model = BuyerUser
        fields = '__all__'elf.cognito_sub = sub
      cognito.add_group(self.preferred_username, grupo)


       

return super(BuyerUserAddForm, self).save(commit=commit) return super(BuyerUserAddForm, self).save(commit=commit)

class Meta:
    model = BuyerUser
    # fields = '__all__'
    exclude = ['terms_conditions_accepted_datetime']


class BuyerUserChangeForm(forms.ModelForm):
    class Meta:
        model = BuyerUser
        fields = '__all__'

create创造

django 创建管理员

Change改变

django更改管理员

This cognito sub field should have its value override after cognito-user is created.在创建 cognito-user 后,此cognito 子字段应具有其值覆盖。 as it should be happening in the following code因为它应该在下面的代码中发生

cognito = CognitoDriver()
sub = cognito.parse_user(
    cognito.create_user(self.preferred_username, self.email)["User"]
)["Sub"]
self.cognito_sub = sub

In fact, this cognito-user is being created and the sub is correct.事实上,这个 cognito-user 正在被创建,并且 sub 是正确的。 the BIG PROBLEM is: this sub is not saved.大问题是:这个子没有保存。 It is getting only the value from the form.它只从表单中获取价值。 I've tried to hide sub field using exclude = ['cognito_sub','terms_conditions_accepted_datetime'] but only happens to save a empty value.我尝试使用exclude = ['cognito_sub','terms_conditions_accepted_datetime']隐藏子字段,但只是碰巧保存了一个空值。

You may ask why I use Forms instead of simply override model.Save() method and the answer is: I need the grupo field, but this field must be persisted in DB.您可能会问为什么我使用 Forms 而不是简单地覆盖 model.Save() 方法,答案是:我需要grupo字段,但该字段必须保存在 DB 中。 It only exists in Cognito.它仅存在于 Cognito 中。

You have to assign the value to form.instance instead of directly to the form itself.您必须将值分配给form.instance而不是直接分配给表单本身。

class BuyerUserAddForm(forms.ModelForm):
    grupo = forms.CharField()

    # ...

    def save(self, commit=True):
        grupo = self.cleaned_data.get('grupo', None)
        self.preferred_username = self.cleaned_data.get('preferred_username', None)
        self.email = self.cleaned_data.get('email', None)
        cognito = CognitoDriver()
        sub = cognito.parse_user(
        cognito.create_user(self.preferred_username, self.email)["User"])["Sub"]
        self.instance.cognito_sub = sub
        cognito.add_group(self.preferred_username, grupo)

        return super(BuyerUserAddForm, self).save(commit=commit)

You might even want to disable the input field completly using the disabled attribute.您甚至可能希望使用disabled属性完全禁用输入字段。 https://docs.djangoproject.com/en/4.0/ref/forms/fields/#disabled https://docs.djangoproject.com/en/4.0/ref/forms/fields/#disabled

class BuyerUserAddForm(forms.ModelForm):
    cognito_sub = forms.CharField(disabled=True)
    # ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM