模型:
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字段 - 它是当前用户,因此应由系统自动设置。但无论我如何尝试,要么验证不起作用,要么会出现其他错误。
我尝试过的方法(单独或组合):
- Creating a hidden field in the related ModelField
Defining init in ProjectTypeForm (in various ways), for example:
def __init__(self, *args, **kwargs): self.user = kwargs.pop('user', None) super(ProjectTypeForm, self).__init__(*args, **kwargs) self.fields['owner'].initial = self.user
Setting values in the view like:
... 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 ...
Overriding clean() method of the form in various ways, along these lines:
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) ...
记录一下 - 如果在表单中 owner 是一个常规字段,则所有内容都按预期工作,但我不能允许用户设置 owner 值。
有没有任何优雅的解决方案呢?
谢谢!
clean()
总是在所有其他字段验证之后调用,因此如果slug
是必填字段,则它将始终存在。只是这样说而已。无论如何,你是对的,这不是生产就绪的代码! - Greg