Django CreateView:如何在保存时执行操作

Car*_*rie 25 django

我正在使用自定义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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 49

form_valid()对方法CreateViewUpdateView保存表单,然后重定向到成功URL.这是不可能的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())
Run Code Online (Sandbox Code Playgroud)

第二个选项是继续调用super(),但在更新关系之后才返回响应.这样做的好处是你不会复制代码super(),但缺点是它不清楚发生了什么,除非你熟悉它是什么super().

def form_valid(self, form):
    response = super(CourseCreate, self).form_valid(form)
    # do something with self.object
    return response
Run Code Online (Sandbox Code Playgroud)

  • 哇,谢谢,这是有效的(我选择了第一个透明度选项)。我确实花了很多时间查看文档,但仍然发现自己很难解决此类问题。非常感谢@Alasdair! (3认同)
  • 我个人也更喜欢第一个选项。很高兴它有所帮助:-) (2认同)