如何使用外键值预填充Django中的另一个表单字段

时间:2020-06-09 21:16:27

标签: python django

我有两个模型,一个具有成员详细信息,另一个是用户模型,我想要的是在创建成员帐户时在User模型中使用成员模型的外键。

在一个形式中,当选择与外键的成员的姓名,电子邮件字段应预先填充来自成员的表值。

我知道ajax可以对数据库进行异步调用,但是我如何实现呢?谢谢。

用户模型

class User(AbstractBaseUser , PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True, blank=True, null=True)
    username = models.CharField(max_length=30, unique=True)
    Role = models.CharField(max_length=250, choices=roles, blank=True, null=True)
    full_name =  models.ForeignKey('Members', on_delete=models.SET_NULL,  max_length=100, null=True, blank=True)
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False)  
    is_superuser = models.BooleanField(default=False)
    Is_View_on_Web = models.CharField(max_length=20, default='Yes', choices=OPTIONS,null=True,blank=True)
    USERNAME_FIELD = 'username'
    REQUIRED_FILEDS = []
    objects = UserManager()
    published = PublishedStatusManager()
    def __str__(self):
        return str(self.full_name)

会员模型

class Members(models.Model):
    First_Name=models.CharField(max_length=100,null=True)
    Second_Name=models.CharField(max_length=100,null=True)
    Home_Cell=models.CharField(max_length=100, choices=cell,null=True)
    Residence=models.CharField(max_length=100,null=True)
    Telephone=models.CharField(max_length=100,null=True)
    Email=models.CharField(max_length=100,null=True, blank=True)
    def __str__(self):
       return str(self.First_Name )+ ' ' + str(self.Second_Name)

这是我的 register.html

<form method="POST">
            {% csrf_token %}
                <fieldset class="form-group">
                    <legend class="border-bottom">Add New User to the System</legend>
                    <div class="separator"></div>   
                    <div class="form-group">
                    {{ form|crispy}}
                    </div>      
                </fieldset>
                <div class="form-group">
                    <button class="btn btn-primary" type="submit"> Submit</button> 
                </div>

         </form>

form.py

class RegisterForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['full_name','email','username','Role','Is_View_on_Web']

1 个答案:

答案 0 :(得分:1)

这是我经过测试的命题,并且效果很好:

form.py =>添加将调用您.html中定义的JS函数的属性

from django.forms import ModelForm, Form
from .models import User


class RegisterForm(ModelForm):
    class Meta:
        model = User
        fields = ['username', 'full_name', 'email',  'Role', 'Is_View_on_Web']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['full_name'].widget.attrs['onchange'] = "load_email()"

.html:=>定义JS函数

<body>
<form id = "myform" method="POST">
            {% csrf_token %}
                <fieldset class="form-group">
                    <legend class="border-bottom">Add New User to the System</legend>
                    <div class="separator"></div>
                    <div class="form-group">
                    {{ form }}
                    </div>
                </fieldset>
                <div class="form-group">
                    <button class="btn btn-primary" type="submit"> Submit</button>
                </div>

         </form>
</body>
<script>
function load_email()
{
document.getElementById('myform').action = "/stack/myview";
document.getElementById("myform").submit();
}
</script>

Views.py:=>新视图将在数据库中查找电子邮件地址并返回模板

def myview(request):
    form = RegisterForm(request.POST)
    if form.is_valid():
        db = form.save(commit=False)
        db.email = Members.objects.get(id__exact=form['full_name'].value()).Email
        form = RegisterForm(instance=db)
        content = {'form': form}
        return render(request, 'stack/index.html', content)
    else:
        content = {'form': form}
        return render(request, 'stack/index.html', content)
相关问题