一尘不染

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

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)

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)

阅读 717

收藏
2020-04-01

共1个答案

一尘不染

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())

第二种选择是继续调用super(),但是直到你更新了关系后才返回响应。这样做的好处是你没有在中复制代码super(),但是缺点是除非你熟悉所super()执行的操作,否则不清楚正在发生的事情。

def form_valid(self, form):
    response = super(CourseCreate, self).form_valid(form)
    # do something with self.object
    return response
2020-04-01