【问题标题】:Django: how to add custom fields to data on form save?Django:如何将自定义字段添加到表单保存的数据中?
【发布时间】:2020-06-08 22:34:49
【问题描述】:

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

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

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)

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

这是模型

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

【问题讨论】:

  • 你能分享你的模型吗?

标签: django django-views


【解决方案1】:

你可以制作一个表单没有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)

您也可以在模型中为status 指定default 值,并将editable=… parameter [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

【讨论】:

  • 谢谢您,先生,如果我想添加登录用户的主键,我想这个过程是相似的,无需更新模型。再次感谢您
  • @Gunnit:是的,请参阅编辑。 @login_required可以保证只有登录的用户才能触发这个视图,见:docs.djangoproject.com/en/dev/topics/auth/default/…
  • 我把它改成了你认为更好的:form = form.save(commit=False) form.user_rel = request.user form.save()
  • @Gunnit:请不要。这是一种常见的反模式。我前段时间写了一个markdown为什么会导致问题:github.com/hapytex/django-antipatterns/blob/master/antipatterns/…
猜你喜欢
  • 2021-12-31
  • 2014-04-02
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多