【发布时间】:2012-05-12 11:04:02
【问题描述】:
型号:
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。请注意 owner 字段 - 它应该是当前登录用户。问题是如何确保 unique_together 中的约束得到正确验证。
我不想在表单上显示 owner 字段 - 它是当前用户,所以它应该由系统自动设置。但无论我如何尝试这样做,要么验证不起作用,要么还有其他错误。
在我尝试过的方法中(单独或组合):
- 在相关的 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 -
在视图中设置值,如:
... 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)唯一性验证:所有者/类型名称和所有者/类型_slug。我遇到的典型错误是(a)owner 未被识别为用户(它被视为 PK),(b)不正确的验证(如缺少它或它错过了它相同的事实正在编辑的记录等),(c) 所有者是必填字段。
作为记录 - 如果 owner 是表单中的常规字段,则一切正常,但我不能允许用户设置 owner 值。
是否有任何优雅的解决方案来解决这个问题?
谢谢!
【问题讨论】:
标签: django forms validation authentication modelform