我可能完全不在这里预订。(如果我是,请随时告诉我。)
我的用例是我有一个学校列表。学校模式很简单:
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 实例和一个“master”的特殊用户)?
(还有一个小麻烦——因为我是 Django 的老手,但是新的基于类的视图,我正在尝试使用 Vanilla Views,因为我发现更容易弄清楚发生了什么。)