如何在ModelAdmin中为自定义字段分配初始值? [英] How to assign initial value to a custom fields in ModelAdmin?

查看:72
本文介绍了如何在ModelAdmin中为自定义字段分配初始值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to extends django user auth through onetonefield in model. Here is the model:

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

使用基本的管理面板,我首先创建用户实例,然后创建配置文件。但是我在管理面板上使用自定义表单,因此可以在一个表单上创建它。

With basic admin panel i get to create user instance first and then profile. But i use custom forms on admin panel so i can create it on one form.This is the forms look:

配置文件添加表单

这是forms.py

this is 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

and this is 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字段显示了此值。

With this all i can create profile instance just fine. But when i try to change/edit profile it didn't show initial value for username and password fields, only nim field did.

空的用户名和密码字段

感谢您的帮助

推荐答案

尝试一下:

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

也可以尝试一下并查看差异:(只有超级调用后才能使用字段)

also try this and see the diff: (fields lives only after super call)

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

这篇关于如何在ModelAdmin中为自定义字段分配初始值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆