モデル:
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
次のようなビューで値を設定します。
... 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) 所有者は必須フィールドです。
レコードについて -所有者がフォームの通常のフィールドである場合、すべてが期待どおりに機能しますが、ユーザーが所有者の値を設定できるようにすることはできません。
これに対するエレガントな解決策はありますか?
ありがとう!