【发布时间】:2018-11-04 05:09:47
【问题描述】:
TL;DR:我想使用 CreateView 类保存外键——我可以保存我的用户组,但不能保存我自己的模型对象。
上下文:我正在编写一个处理组、帖子和用户的 Django 应用程序。帖子条目包含组和用户的外键(帖子必须属于组和用户)。我希望用户能够从群组页面本身向群组添加帖子 - 即当他们访问此新帖子的 CreateView 表单时,不应该有“群组”字段。
我的问题:我想保存一个带有 CreateView 类的新帖子对象,该类在幕后插入 Group(来自 slug)和 User(来自 self.request.user )。通常,我使用 form_valid() 方法来执行此操作,它可以很好地插入 User 对象;但是,我无法弄清楚为什么我的 Group 对象不会保存。
其他一些信息:
我知道我能够成功地从 kwargs 中的 slug 中获取 Group 对象。我已将此对象分配给 get() 方法中的变量 self.form_group,并且我已确认该对象的“类型”是我的 Group 类的正确实例。
我已尝试在 form_valid() 方法本身中“获取”Group 对象:仍然没有成功。
我已经分别在 form_valid() 方法中尝试了注释和未注释的代码块。
模型:
class Post(models.Model):
user = models.ForeignKey(User, on_delete = models.CASCADE, related_name = 'posts')
title = models.CharField(max_length = 100,default = '')
created_at = models.DateTimeField(auto_now = True)
post_text = models.TextField()
post_text_html = models.TextField(editable = False)
group = models.ForeignKey(Group, on_delete = models.CASCADE, related_name = 'posts', null = True, blank = True)
-
class Group(models.Model):
name = models.CharField(max_length = 255, unique = True)
slug = models.SlugField(allow_unicode = True, unique = True)
description = models.CharField(max_length = 5000, blank = True, default = '')
description_html = models.TextField(editable = False, blank = True, default = '') # Cannot be Edited
members = models.ManyToManyField(User, through = 'GroupMember')
Views.py
class CreatePostInGroup(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
model = Post
fields = ['title', 'post_text']
template_name = 'posts/post_in_group_form.html'
def get(self, request, *args, **kwargs):
print(self.kwargs)
print(type(self.request.user))
self.form_group = get_object_or_404(Group, slug=self.kwargs.get('slug'))
print(type(self.form_group))
return super(CreatePostInGroup, self).get(request, *args, **kwargs)
def form_valid(self, form):
form.instance.user = self.request.user
try:
form.instance.group = self.form_group
except:
return Http404
return super(CreatPostInGroup, self).form_valid(form)
def get_context_data(self, *args, **kwargs):
context = super(CreatePostInGroup, self).get_context_data(*args, **kwargs)
context['group'] = Group.objects.get(slug=self.kwargs.get('slug'))
return context
感谢您的帮助,这让我发疯了!
【问题讨论】:
标签: python django database django-models django-class-based-views