私はここで予約を完全に外れるかもしれません。(もし私がそうでしたら遠慮なく教えてください。)
私の使用例は、学校のリストを持っていることです。学校のモデルは非常に単純です。
class School(models.Model):
name = models.CharField(max_length=100)
mascot = models.CharField(max_length=100, null=True, blank=True)
ユーザーがこれらの学校のいずれかを編集したい場合、マスター コピーを編集してほしくありません。代わりに、彼らがプレイできる独自のコピーを提供したいと考えています。コピーの編集が完了したら、変更を送信できます。他の人がそれを承認します。したがって、ユーザーの学校のコピー用に別のクラスがあります。
class UserSchool(models.Model):
name = models.CharField(max_length=100)
mascot = models.CharField(max_length=100, null=True, blank=True)
master_school = models.ForeignKey(School)
user = models.ForeignKey(settings.AUTH_USER_MODEL)
そこで、UserSchool の編集を処理するフォームを設定しました。
class UserSchoolForm(forms.ModelForm):
class Meta:
model = UserSchool
fields = ['name','mascot']
これで、EditSchool フォームができました。
class EditSchool(UpdateView):
model = School
success_url = reverse_lazy('list_schools')
form_class = UserSchoolForm
def get(self, request, *args, **kwargs):
school = self.get_object()
# make a copy of the school for this user
user_school, created = UserSchool.objects.get_or_create(
master_school=school, user=request.user,
defaults={'name' : school.name, 'mascot' : school.mascot})
self.object = user_school
form = UserSchoolForm()
context = self.get_context_data(form=form)
return self.render_to_response(context)
get() がコピーを正しく作成していることはわかっていますが、フォームが表示されると、「名前」または「デフォルト」フィールドに値がリストされていません。私の疑いでは、問題は cls.model = School であるという事実にありますが、self.object は UserSchool のインスタンスです。
私は近くにいますが、何かが欠けていますか? 私は完全に間違った道を進んでいますか?これに適したモデルはありますか (「マスター」の特別なユーザーを持つ単一の School インスタンスを持つなど)?
(そして 1 つの小さな複雑な問題 - 私は Django の古い手ですが、クラスベースのビューは新しいので、何が起こっているのかを把握しやすいので、Vanilla Views を使用しようとしています。)