当前位置: 首页 > 面试题库 >

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

阙繁
2023-03-14
问题内容

我正在使用自定义的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)

问题答案:

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


 类似资料:
  • 我得到了"org.springframework.dao.数据完整性违反异常:无法执行语句;SQL[n/a];约束[null];嵌套异常是org.hibernate.exception.约束违反异常:无法执行语句"异常,同时将对象保存到存储库。 要求:计划将只有一个Cpricing对象,因此我添加了@OneToOne映射。下面是预期的表结构。 我在实体类中有以下代码更改: 当试图保存包含CPric

  • 根据对条件dplyr评估的讨论,我想根据传递的数据帧中是否存在参考列,有条件地在管道中执行一个步骤。 和生成的结果应该是相同的。 对于可用列,传递的对象与初始数据帧不对应。原始代码返回错误消息: :未找到对象 我尝试过其他语法(运气不佳): 我想扩展这个问题,以解释调用中右侧的评估。例如,下面的语法试图过滤第一个可用值。mtcars% 预期的是,调用的结果是错误消息: 中出错:结果的长度必须为32

  • 问题内容: 我有一个http服务器(使用启动),我想做一些操作。 我该怎么做(在Linux上)?在ctrl-C的情况下可以进行那些操作吗? 我不熟悉Unix信号,因此答案可能很简单。 问题答案: 您可以使用信号包订购TERM和INT信号。但是请注意,只有在明确终止进程时才发送这些信号。正常退出(由流程本身启动)不涉及任何信号。我认为,对于正常退出,只需在主例程中执行某些操作即可(该例程应该生成工作

  • 我正在使用Spring Boot编写一套微服务,我需要运行一些BDD风格的集成测试,这些测试独立于其他测试。为了弄清楚是怎么回事,我已经在其中一个生产者上使用Spring Cloud contract编写了一个非常简单的contract。这里是: 在消费者方面,我得到了一个运行良好的存根。我在集成测试中使用了Cucumber,因此我设置了运行程序,如下所示: 在相当长的延迟之后,我得到了这个错误:

  • 问题内容: 伙计们,我想在mysql中使用解析函数滞后。在Oracle中受支持,但在Mysql中无法做到。那么有人可以帮助我如何在Mysql中执行滞后运算吗?例如 我想使用滞后函数,以便我的输出如下 Mysql支持滞后功能吗??? 问题答案: 您可以使用用户变量来模拟它: 看到它在工作sqlfiddle直播 在这里,您可以初始化变量。这与在编写查询之前编写内容相同。 那么这些语句在select子句

  • 我目前正在围绕Quartz.net开发某种简化的包装器,以便能够管理所有在后台注册和运行的作业,显示关于作业执行进度、百分比、返回关于当前作业状态的某种消息等的附加信息。例如,如果我目前的工作是将数据发布到社交媒体,我想看看当前发布到哪个社交媒体的数据,或者如果工作是发送电子邮件,我想实时查看当前生成了多少电子邮件,已经生成了多少电子邮件发了,还剩多少,等等。为此,我将数据保存到中的作业方法。然后