我有两个模型,一个具有成员详细信息,另一个是用户模型,我想要的是在创建成员帐户时在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']
答案 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)