【问题标题】:How to assign initial value to a custom fields in ModelAdmin?如何为 ModelAdmin 中的自定义字段分配初始值?
【发布时间】:2016-11-15 07:30:13
【问题描述】:

我正在尝试通过模型中的 onetonefield 扩展 django 用户身份验证。这是模型:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nim = models.CharField(max_length=10, blank=True)

    def __str__(self):
        return self.user.username

使用基本管理面板,我可以先创建用户实例,然后再创建个人资料。但我在管理面板上使用自定义表单,所以我可以在一个表单上创建它。这是表单外观:

Profile add form

这是forms.py

from django import forms
from django.contrib.auth.models import User

from .models import Profile  


class ProfileForm(forms.ModelForm):
    username = forms.CharField(required=False, max_length=150)
    password = forms.CharField(required=False, max_length=50, widget=forms.PasswordInput)

    class Meta:
        model = Profile
        fields = ('username', 'password', 'nim')

这是 admin.py

from django.contrib import admin
from django.contrib.auth.models import User

from .forms import ProfileForm
from .models import Profile


class ProfileAdmin(admin.ModelAdmin):
    form = ProfileForm

    def save_model(self, request, obj, form, change):
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user = User.objects.create_user(username=username, password=password)
        user.save()
        obj.user = user
        obj.save()


admin.site.register(Profile, ProfileAdmin)

有了这些,我就可以创建配置文件实例了。但是当我尝试更改/编辑配置文件时,它没有显示用户名和密码字段的初始值,只有 nim 字段显示。

empty username and password field

感谢您的帮助

【问题讨论】:

    标签: django django-forms django-admin


    【解决方案1】:

    试试这个:

    class ProfileAdmin(admin.ModelAdmin):
        form = ProfileForm
        # ...
        def get_form(self, request, obj=None, *args, **kwargs):
            form = super(ProfileAdmin, self).get_form(request, *args, **kwargs)
            #find the user via user profile forien key
            the_user = User.objects.filter(pk=Profile.user.pk)
            # Initial values
            form.base_fields['username '].initial = the_user.username
            return form
    

    也试试这个,看看差异:(字段仅在超级调用后才存在)

            form.fields['username '].initial = the_user.username
    

    【讨论】:

    • 哎呀:the_user = User.objects.filter(pk=Profile.user.pk)
    • form.fields 引发属性错误,说 ProfileForm 没有属性字段。 form.base_fields 为我工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多