gpt4 book ai didi

Django 表单验证,将经过身份验证的用户作为字段

转载 作者:行者123 更新时间:2023-12-02 03:07:45 25 4
gpt4 key购买 nike

型号:

class ProjectType(models.Model):
project_type_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=45, help_text='Type of project', verbose_name='Project Type')
slug = models.SlugField(max_length=45, blank=True)
description = models.CharField(max_length=400, help_text='Description of the main purpose of the project', verbose_name='Project Type Description')
default = models.BooleanField(default=False)
owner = models.ForeignKey(User)
class Meta:
...
unique_together = (('slug', 'owner'),('name', 'owner'))

我需要一个表单来创建/更新 ProjectType。请注意所有者字段 - 它应该是当前登录的用户。问题是如何确保 unique_together 中的约束得到正确验证。

我不想在表单上显示所有者字段 - 它是当前用户,因此应该由系统自动设置。但无论我如何尝试,要么验证不起作用,要么出现其他错误。

我尝试过的方法(单独或组合):

  • 在相关 ModelField 中创建隐藏字段
  • 在 ProjectTypeForm 中定义 init(以各种方式),例如:

    def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user', None)
    super(ProjectTypeForm, self).__init__(*args, **kwargs)
    self.fields['owner'].initial = self.user
  • 在 View 中设置值,例如:

    ...
    if request.method == 'POST':
    project_type = ProjectType(owner=request.user)
    form = ProjectTypeForm(request.POST, instance=project_type, user = request.user.pk) # also tries w/o pk
    ...
  • 以各种方式重写表单的 clean() 方法,大致如下:

    def clean(self):
    cleaned_data = super(ProjectTypeForm, self).clean()
    slug=cleaned_data.get('slug')
    owner = cleaned_data.get('owner')

    if slug:
    user = User.objects.get(pk=owner)
    ...

其中许多方法都基于 stackoverflow.com 上找到的各种答案。但是,无论我尝试什么,我都找不到完成我需要的方法:(1)自动设置所有者字段和(2)验证唯一性:owner/type_name 和owner/type_slug。我遇到的典型错误是 (a) 所有者 不被识别为用户(它被视为 PK),(b) 验证不正确(比如缺少它或者它错过了它是相同的事实正在编辑的记录等),(c) 所有者是必填字段。

郑重声明 - 如果所有者是表单中的常规字段,则一切都会按预期工作,但我不能允许用户设置所有者值。 p>

有没有任何优雅的解决方案来解决这个问题?

谢谢!

最佳答案

从表单中排除所有者字段,并将用户保存在表单的 init 方法中 - 然后您可以使用它来验证表单,例如

class ProjectTypeForm(...):
...
def __init__(self, user, *args, **kwargs):
super(ProjectTypeForm, self).__init__(*args, **kwargs)
self.user = user

def clean(self):
user_projects = ProjectType.objects.filter(owner=self.user)
if user_projects.filter(slug=self.cleaned_data['slug']):
raise forms.ValidationError('...')
elif user_projects.filter(name=self.cleaned_data['name']):
raise forms.ValidationError('...')
else:
return self.cleaned_data

然后在您看来,在创建新的 ProjectType 时执行类似以下操作:

if request.method == 'POST':
form = ProjectTypeForm(request.user, request.POST)
if form.is_valid():
ptype = form.save(commit=False)
ptype.owner = request.user
ptype.save()

不过,您不应该需要它来保存现有的 ProjectType 对象。

关于Django 表单验证,将经过身份验证的用户作为字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10422791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com