首页 > 解决方案 > Django:如何将自定义字段添加到表单保存的数据中?

问题描述

当用户提交表单时,我想在模型中插入一些自定义变量,例如状态。我希望在插入新记录时将字段状态更新为待处理。这应该在用户插入新表单时自动完成。我知道如何使用用户设置的值插入表单,我如何插入自己的值。

我当前将所有数据插入数据库的表单,它看起来像这样

def createProcess(request):
    form = ProcessForm()
    if request.method =='POST':
        #print('Printing POST request : ', request.POST)
        form = ProcessForm(request.POST) 
        if form.is_valid():

            form.save() # above this i think i can add something to set the status
            return redirect('process_list')

    context = {'form' : form}

    return render(request, 'process/create_process.html', context)

如何自定义例如状态字段的值?我希望在用户不提交任何信息的情况下自动更新状态字段。

这是模型

class ProcessInfo(models.Model):
    process_name = models.CharField(max_length=120, null=True)
    process_L2_process_name = models.CharField(default='L2 Process Name', max_length=120, null=True)
    process_L3_process_name = models.CharField(default='L3 Process Name', max_length=120, null=True)
    process_critical = models.BooleanField(default=True, null=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    status = models.CharField(max_length=200, null=True, choices=STATUS)
    user_rel = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    tags = models.ManyToManyField(Tag)
    def __str__(self):
        return self.process_name

标签: djangodjango-views

解决方案


您可以制作没有status字段的表单:

class ProcessForm(forms.ModelForm):
    class Meta:
        model = Process
        exclude = ('status',)

在视图中,您可以设置.status实例的:

from django.contrib.auth.decorators import login_required

@login_required
def createProcess(request):
    form = ProcessForm()
    if request.method =='POST':
        form = ProcessForm(request.POST) 
        if form.is_valid():
            form.instance.status = 'pending'
            form.instance.user_rel = request.user
            form.save()
            return redirect('process_list')

    context = {'form' : form}
    return render(request, 'process/create_process.html', context)

但是,您也可以在模型中指定defaultstatus,并设置editable=…参数 [Django-doc]False防止它出现在表单中,然后它会自动设置为默认值:

class ProcessInfo(models.Model):
    # …
    status = models.CharField(
        max_length=200,
        null=True,
        choices=STATUS,
        default='pending',
        editable=False
    )

    def __str__(self):
        return self.process_name

推荐阅读