【发布时间】:2020-02-26 17:54:24
【问题描述】:
我有一个很少字段的 Django 模型,在使用该 django 模型创建的 django 表单中。在使用 forms.save 方法时,我还想保存 Django 表单中不存在但存在于 django 模型中的额外字段。
models.py
class NewProvisionalEmployeeMail(models.Model):
STATUS_CHOICES = (
(1, ("Permanent")),
(2, ("Temporary")),
(3, ("Contractor")),
(4, ("Intern"))
)
PAY_CHOICES = (
(1, ("Fixed")),
(2, ("Performance Based")),
(3, ("Not Assigned")),
)
POSITION_CHOICES = ()
for i, name in enumerate(Position.objects.values_list('position_name')):
POSITION_CHOICES += ((i, name[0]),)
email = models.EmailField(max_length=70, null=False, blank=False, unique=False)
token = models.TextField(blank=False, null=False)
offer_sent_by = models.CharField(max_length=50)
position_name = models.IntegerField(choices=POSITION_CHOICES, null=True, blank=True)
accepted = models.BooleanField(default=False)
name=models.CharField(max_length=30)
user_name=models.CharField(max_length=30)
pay = models.IntegerField(default=0)
title = models.CharField(max_length=25, null=True, blank=True)
pay_type = models.IntegerField(choices=PAY_CHOICES, default=3)
emp_type = models.IntegerField(choices=STATUS_CHOICES, default=1)
def __str__(self):
return str(self.offer_sent_by) +" to " + str(self.email)
def clean(self):
if(NewProvisionalEmployeeMail.objects.filter(email=str(self.email)).exists()):
NewProvisionalEmployeeMail.objects.filter(email=str(self.email)).delete()
def save(self, **kwargs):
self.clean()
return super(NewProvisionalEmployeeMail, self).save(**kwargs)
如果您看到它有以下字段:
email,token,offer_sent_by,position_name,accepted,name,user_name,pay,title,@9876543332@,@987654。
现在我只想要表单中的以下字段:
email、position_name、name、user_name、pay、title、pay_type、emp_type 而不是 token 和 offer_sent_by,它们的值将在我的视图中确定。使用一些逻辑。
forms.py
class NewProvisionalEmployeeMailForm(ModelForm):
class Meta:
model = NewProvisionalEmployeeMail
fields = ['email', 'position_name',
'name', 'user_name', 'pay',
'title', 'pay_type', 'emp_type',
]
根据我的views.py中的逻辑,其他字段值是在函数内部生成的,但是由于要保存模型,我们必须使用formname.save,这里是NewProvisionalEmployeeMailForm.save()。但是,这只会保存来自我的模板表单的字段,如何在使用此函数保存时添加其他左侧字段。
views.py
def sendoffer(request):
context = {}
new_emp_form = NewProvisionalEmployeeMailForm();
context['form'] = new_emp_form
hostname = request.get_host() + "/dummyoffer"
if request.method=='POST':
new_emp_form = NewProvisionalEmployeeMailForm(request.POST)
if(new_emp_form.is_valid()):
token = VALUE COMES FROM LOGIC
offer_sent_by = VALUE COMES FROM LOGIC
# I also want to save the fields token, offer_sent_by in my models using this form save method
new_emp_form.save()
return render(request, 'mainapp/offer.html',context)
如您所见,new_emp_form save 方法将仅保存表单中存在的字段,而不是字段token 和offer_sent_by,这也是模型的一部分。如何使用 form.save 方法保存字段?
【问题讨论】:
标签: python django django-models django-forms django-views