首页 > 解决方案 > 如何保存我的 ForeignKey 的属性?

问题描述

我正在尝试创建一个视图,允许用户在我的课程模型中上传他们的文档。但是,当文件上传时,我无法保存提交表单的实例。当我访问管理页面时,我的 ForeignKey 字段为空。

这是用户提交文件的views.py:

class UploadLessonView(CreateView):
model = Lesson
fields = ['title', 'file']  
template_name = 'store/upload_lesson.html'
success_url = '../'

def form_valid(self, form):
    form.instance.author = self.request.user
    return super(UploadLessonView, self).form_valid(form)

这是我的子模型的 models.py:

class Lesson(models.Model):
title = models.CharField(max_length=100)
file = models.FileField(upload_to="lesson/pdf")
date_posted = models.DateTimeField(default=timezone.now)
post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('lesson_upload', kwargs={'pk': self.pk})

对于我的父模型:

class Post(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(default = 'default0.jpg', upload_to='course_image/')
description = models.TextField()
price = models.DecimalField(decimal_places=2, max_digits=6)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
rating = models.IntegerField(default = 0)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('post-detail', kwargs={'pk' : self.pk})

提交文件时,Post 字段为空。

标签: django

解决方案


您没有在视图中设置Post对象Lesson。因此,您可以通过两种方式修复它。

一种方法是通过 url 发送它,例如:

# url
url('lesson/<int:post_id>/create/', UploadLessionView.as_view())

并使用post_id视图中的值:

class UploadLessonView(CreateView):
    model = Lesson
    fields = ['title', 'file']  
    template_name = 'store/upload_lesson.html'
    success_url = '../'

    def form_valid(self, form):
        form.instance.post = get_object_or_404(Post, pk=self.kwargs.get('post_id'))
        return super(UploadLessonView, self).form_valid(form)

、可以post在字段中添加:

class UploadLessonView(CreateView):
    model = Lesson
    fields = ['title', 'file', 'post']  # <-- Here
    template_name = 'store/upload_lesson.html'

推荐阅读