我正在使用自定义的CreateView(CourseCreate)和UpdateView(Course update)来保存和更新课程。我想在课程保存后采取行动。我将在新课程的讲师和用户之间创建一个新的多对多关系(如果它还不存在的话)。
所以,我想将课程保存为课程,然后使用Course.faculty创建新的关系。最好的地方是哪里?
我试图用视图中有效的form_执行此操作,但在尝试访问form.instance.faculty bc时出现错误课程尚未创建(在CourseCreate中)。错误消息如下:
“Course:…”需要对字段“Course”有一个值,才能使用这种多对多关系。
当然也不能更新。未创建辅助关系。我应该在表格里试一下吗?但我不知道如何将用户信息发送到表单。 谢谢您。
模型.py
class Faculty(models.Model):
last_name = models.CharField(max_length=20)
class Course(models.Model):
class_title = models.CharField(max_length=120)
faculty = models.ManyToManyField(Faculty)
class UserProfile(models.Model):
user = models.OneToOneField(User)
faculty = models.ManyToManyField(Faculty, through='Assists')
class Assists(models.Model):
user = models.ForeignKey(UserProfile)
faculty = models.ForeignKey(Faculty)
视图.py
class CourseCreate(CreateView):
model = Course
template_name = 'mcadb/course_form.html'
form_class = CourseForm
def form_valid(self, form):
my_course = form.instance
for f in my_course.faculty.all():
a, created = Assists.objects.get_or_create(user=self.request.user.userprofile, faculty=f)
return super(CourseCreate, self).form_valid(form)
class CourseUpdate(UpdateView):
model = Course
form_class = CourseForm
def form_valid(self, form):
my_course = form.instance
for f in my_course.faculty.all():
a, created = Assists.objects.get_or_create(user=self.request.user.userprofile, faculty=f)
return super(CourseUpdate, self).form_valid(form)
用于} 方法保存表单,然后重定向到成功url。不可能执行
CreateView
和UpdateView
的^{return super()
,因为您希望在保存的对象和重定向之间执行操作。第一个选项是不调用
super()
,并在视图中复制这两行。这样做的好处是很清楚发生了什么。第二个选项是继续调用
super()
,但在更新关系之前不要返回响应。这样做的好处是您不会在super()
中复制代码,但缺点是它不太清楚发生了什么,除非您熟悉super()
的功能。我建议使用Django的信号。这是在模型发生某些事情时触发的操作,例如save或update。这样您的代码就保持干净(表单处理中没有业务逻辑),并且您确信它只有在save之后才会被触发。
相关问题 更多 >
编程相关推荐