我使用自定义CreateView(CourseCreate)和UpdateView(CourseUpdate)来保存和更新课程。我想在保存课程时采取行动。我将在新课程的讲师和用户之间创建一个新的多对多关系(如果它还没有存在)。
所以,我想将课程保存为课程,然后使用course.faculty创建新的关系。实现这一目标的最佳地点在哪里?
我尝试在视图中的form_valid中执行此操作,但是在尝试访问form.instance.faculty时我遇到了错误bc该课程尚未创建(在CourseCreate中)。错误消息如下:
"课程:......"需要有一个领域的价值"当然"在此之前可以使用多对多关系。
它也无法在CourseUpdate中使用。未创建“辅助”关系。我应该在表格中尝试这个吗?但我不确定如何将用户信息提供给表单。 谢谢。
models.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)
views.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)
答案 0 :(得分:42)
CreateView
和UpdateView
的{{3}}方法保存表单,然后重定向到成功网址。执行return super()
是不可能的,因为你想在保存的对象和重定向之间做一些事情。
第一个选项是不调用super()
,并在视图中复制两行。这样做的好处是很清楚发生了什么。
def form_valid(self, form):
self.object = form.save()
# do something with self.object
# remember the import: from django.http import HttpResponseRedirect
return HttpResponseRedirect(self.get_success_url())
第二个选项是继续调用super()
,但在更新关系之前不要返回响应。这样做的好处是你不会复制super()
中的代码,但缺点是它不清楚发生了什么,除非你熟悉super()
的内容。
def form_valid(self, form):
response = super(CourseCreate, self).form_valid(form)
# do something with self.object
return response
答案 1 :(得分:1)
我建议使用Django的Signal。这是一个在模型发生某些事情时触发的操作,例如 save 或 update 。这样您的代码保持干净(表单处理中没有业务逻辑),并且您确定它只在 save 之后被触发。
#views.py
from django.dispatch import receiver
...
@receiver(post_save, sender=Course)
def post_save_course_dosomething(sender,instance, **kwargs):
the_faculty = instance.faculty
#...etc