追加のプロパティを追加するために、Django(v1.9)ビルトインユーザーモデルをPlayerクラスで拡張しています。Djangoを拡張するユーザーモデル - フォームの人口エラー
class Player(models.Model):
TIMEZONES=()
user = models.OneToOneField(User, on_delete=models.CASCADE)
... (player-specific properties here)
time_zone = models.CharField(max_length=255, choices=PRETTY_TIMEZONE_CHOICES, blank=True, null=True,)
Djangoの管理パネルからユーザーを作成する場合、必ずしもプレイヤーを作成する必要はないため、ユーザーのみ作成されることがあります。その結果、プレーヤーIDとユーザーIDが正確に一致しません。このように、プレイヤーにリンクされたモデルのModelFormsを移入するとき、これは問題につながることが判明:新しい都市を作成するときに
class City(models.Model):
player = models.ForeignKey(Player, on_delete=models.CASCADE)
name = models.CharField(max_length = 100)
x_coord = models.SmallIntegerField()
y_coord = models.SmallIntegerField()
region = models.CharField(max_length = 100)
def __unicode__(self):
return str(self.player) + "-" + str(self.name)
class Meta:
db_table = 'cities'
class CityForm(ModelForm):
class Meta:
model = City
fields = (
'name',
'player',
'x_coord',
'y_coord',
'region')
これのModelFormが使用されています。ユーザーIDとプレーヤーIDが一致すると問題はなく、プレーヤーIDがフォームに入力され、都市が正常に作成されます。ユーザーIDとプレーヤーIDが異なる場合、プレーヤーIDはフォームに入力されず、フォームは検証されず、都市の作成は失敗します。
Player IDをrequest.userから取得するのに問題はなく、POSTデータを取得した後に検証する前にプレーヤーIDを修正できます。また、Playerが常に作成されるようにポストセーブフックを追加したので、IDは常に一致します。しかし、ユーザデータにアクセス可能で、1対1の関係であるため、フォームはに最初にプレーヤIDを入力する必要があります。
私はここで何が欠けていますか?
私はIDに関して何の仮定もしていませんでしたが、まったく反対です。私は、プレーヤーIDがmodelFormに正しく設定されると考えていました。この問題は複数の市区町村IDではなく、ユーザーのプレーヤーIDが都市作成フォームに入力されない新しい都市を作成するときです。 – seadeer
ああ、私はあなたの問題を回避しようとしていた、私は私の答えを更新する –
私は私の答えを変更しましたので、うまくいけば、これは参考になります。あなたがまだ理解していない場合は、私はそれをクリアしようとすることができます。 –