【问题标题】:Save extra fields to django model apart from the fields which were present in django form(for the same model)除了以 django 形式存在的字段(对于同一模型)之外,将额外的字段保存到 django 模型
【发布时间】: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)

如果您看到它有以下字段: emailtokenoffer_sent_byposition_nameacceptednameuser_namepaytitle,@9876543332@,@987654。 现在我只想要表单中的以下字段: emailposition_namenameuser_namepaytitlepay_typeemp_type 而不是 tokenoffer_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 方法将仅保存表单中存在的字段,而不是字段tokenoffer_sent_by,这也是模型的一部分。如何使用 form.save 方法保存字段?

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    保存表单会返回NewProvisionalEmployeeMail 的实例,因此您可以简单地将返回的对象捕获到变量中,然后设置它的属性:

    if(new_emp_form.is_valid()):
        token = VALUE COMES FROM LOGIC
        offer_sent_by = VALUE COMES FROM LOGIC
        new_emp = new_emp_form.save(commit=False)
        new_emp.token = token
        new_emp.offer_sent_by = offer_sent_by
        new_emp.save()
    

    【讨论】:

    • 感谢 Nico,它按预期工作,刚刚接受了编辑更改
    【解决方案2】:

    第一次我们可以改变如下 new_emp = new_emp_form.save(commit=False) 这样我就不会保存到数据库了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2020-06-22
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多