gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:35:02 26 4
gpt4 key购买 nike

我正在使用自定义的CreateView(CourseCreate)和UpdateView(CourseUpdate)保存和更新类(class)。保存类(class)后,我想采取措施。我将在新类(class)的讲师和用户之间创建一个新的多对多关系(如果尚不存在)。

因此,我想将“类(class)”另存为类(class),然后使用“course.faculty”创建该新关系。做到这一点的最佳地点在哪里?

我正在尝试在 View 中的form_valid中执行此操作,但是尝试访问form.instance.faculty bc时出现错误,该类(class)尚未创建(在CourseCreate中)。错误消息是这样的:

在使用这种多对多关系之前,“类(class):...”必须具有“类(class)”字段的值。

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

最佳答案

form_valid()CreateView UpdateView 方法保存表单,然后重定向到成功URL。不能执行return super(),因为您想在要保存的对象和重定向之间进行操作。

第一种选择是不调用super(),并在 View 中复制这两行。这样做的好处是非常清楚发生了什么。

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

关于django - Django CreateView:如何在保存时执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32998300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com