Django管理隐藏字段不能赋值必须是实例

2024-05-17 15:44:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CustomUser模型,ForeignKey指向另一个模型。在我的注册表单中,我使用了一个隐藏字段,该字段根据用户的搜索结果填充一个值(用户正在搜索一个公司,单击结果后,隐藏的输入值表示该公司的ID)。 当我保存用户对象时,我可以很容易地获得ID,进行查询并将company对象添加到字段中。你知道吗

问题出在我的管理员身上。管理员使用的是相同的表单,而company字段被呈现为隐藏ID值。 当我尝试更改某些用户信息并尝试保存时,会出现以下错误: 无法分配“'3'”:客户用户.kompanija必须是“Kompanija”实例。你知道吗

我以为管理员正在使用来自我的自定义UserAccountAdapter的相同save方法。。。?你知道吗

是否可以覆盖隐藏的输入,以便管理员显示:

forms.ModelChoiceField(queryset=Kompanija.objects.all(), empty_label="Kompanija")

使用保存的用户对象的初始值?你知道吗

我的型号.py地址:

class Kompanija(models.Model):
    naziv = models.CharField(max_length=50)
    adresa = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return self.naziv

class CustomUser(AbstractUser):
    ime = models.CharField(max_length=30, default='')
    prezime = models.CharField(max_length=30, default='')
    kompanija = models.ForeignKey(Kompanija, on_delete=models.CASCADE, null=True, blank=True)
    is_premium = models.BooleanField('premium status', default=False)

    def __str__(self):
        return self.email

我的表单.py地址:

class CustomUserCreationForm(UserCreationForm):
    ime = forms.CharField(max_length=30, label='Ime')
    prezime = forms.CharField(max_length=30, label='Prezime')
    kompanija = forms.CharField(widget=forms.HiddenInput())

    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('username', 'email', 'ime', 'prezime')

class CustomUserChangeForm(UserChangeForm):
    ime = forms.CharField(max_length=30, label='Ime')
    prezime = forms.CharField(max_length=30, label='Prezime')
    kompanija = forms.CharField(widget=forms.HiddenInput())

    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'ime', 'prezime')


class CustomSignupForm(SignupForm):
    ime = forms.CharField(max_length=30, label='Ime')
    prezime = forms.CharField(max_length=30, label='Prezime')
    kompanija = forms.CharField(widget=forms.HiddenInput())

    class Meta:
        model = CustomUser

    def signup(self, request, user):
        user.ime = self.cleaned_data['ime']
        user.prezime = self.cleaned_data['prezime']
        user.kompanija = Kompanija.objects.get(id=self.cleaned_data['kompanija'])
        user.save()
        return user

我的适配器.py地址:

class UserAccountAdapter(DefaultAccountAdapter):

    def save_user(self, request, user, form, commit=True):
        user = super(UserAccountAdapter, self).save_user(request, user, form, commit=False)
        user.ime = form.cleaned_data.get('ime')
        user.prezime = form.cleaned_data.get('prezime')
        user.kompanija = Kompanija.objects.get(id=form.cleaned_data.get('kompanija'))
        user.save()

我的管理员.py地址:

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'ime', 'prezime', 'username', 'kompanija', 'is_premium']

    fieldsets = (
        (('Korisnik'), {'fields': ('email', 'ime', 'prezime', 'username', 'kompanija', 'is_premium')}),
    )


admin.site.register(CustomUser, CustomUserAdmin)
admin.site.register(Kompanija)

我的设置.py地址:

ACCOUNT_FORMS = {
'signup': 'korisnici.forms.CustomSignupForm',
}

ACCOUNT_ADAPTER = 'korisnici.adapter.UserAccountAdapter'

Tags: selfformmodelsformslengthlabelmaxclass
1条回答
网友
1楼 · 发布于 2024-05-17 15:44:15

经过更多的研究和崩溃我的网站,我找到了一个解决办法。 我需要在我的表单.py只是为了管理网站。你知道吗

在我的表单.py我补充说:

class CustomUserAdminForm(forms.ModelForm):
  class Meta:
    model = CustomUser
    fields = ('email', 'ime', 'prezime', 'username', 'kompanija', 'is_premium')

还有我的管理员.py地址:

class CustomUserAdmin(UserAdmin):
    form = CustomUserAdminForm
    model = CustomUser
    list_display = ['email', 'ime', 'prezime', 'username', 'kompanija', 'is_premium']

    fieldsets = (
        (('Korisnik'), {'fields': ('email', 'ime', 'prezime', 'username', 'kompanija', 'is_premium')}),
    )

admin.site.register(CustomUser, CustomUserAdmin)
admin.site.register(Kompanija)

现在一切正常了。你知道吗

相关问题 更多 >