我有一个具有以下实现的类Task:
class Task(models.Model):
author = models.ForeignKey(Author, unique=False)
name = models.CharField(max_length=255)
completed = models.BooleanField(default=False)
deadline = models.DateTimeField(null=True, blank=True)
pub_date = models.DateTimeField(auto_now_add=True, editable=False)
edit_date = models.DateTimeField(auto_now_add=True, auto_now=True, editable=False)
tag = models.ManyToManyField(Tag, related_name='tags', null=True, blank=True, default=None)
# group = models.ForeignKey(Group, blank=True, default=None)
def __str__(self):
return u'%s' % (self.name)
def toggle_complete(self):
self.completed = not self.completed
def is_past_deadline(self):
return timezone.now() > self.deadline
我正在尝试创建一个带有标题的新Task
的简单表单。但是,正如您所看到的,author
属性不能为空(当然也不想要)。
作者实施如下:
class Author(models.Model):
user = models.OneToOneField(User, primary_key=True)
name = models.CharField(max_length=30)
def __str__(self):
return u'%s' % (self.user)
我尝试隐藏author
字段,并覆盖get_form_kwargs
,form_valid
,get_form
等方法,将其设置为当前登录用户,但我始终失败。简单地说,id既不作为发布数据发送(如在调试跟踪中看到),也不从视图本身获取。
我最好的结果是显示了作者字段,正确地创建了用户,但得到了一个" success_url"即使模型中声明了get_absolute_url
方法,也找不到。
我正在使用的视图实现如下:
class HomeView(CreateView, MultipleObjectMixin):
# common
model = models.Task
template_name = 'home.html'
#form
form_class = TaskForm
# list
object_list = model.objects.all()
context_object_name = 'tasks'
paginate_by = 40
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated():
return HttpResponseRedirect(reverse('taskr:index'))
return super(HomeView, self).dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
kwargs = super(HomeView, self).get_form_kwargs()
kwargs['initial']['author_id'] = self.request.user.id
return kwargs
def form_valid(self, form):
task = form.save(commit=False)
task.user = models.Author.objects.get(user=self.request.user) # use your own profile here
task.save()
return HttpResponseRedirect(self.get_success_url())
对于记录,视图的MultipleObjectMixing部分可以完美地工作。
我很绝望,Django表格有什么好的资源,比如http://ccbv.co.uk/吗?感谢。
答案 0 :(得分:0)
经过一夜好眠,在清理的同时,我尝试修复form_valid
后代的CreateView
,我做对了。
诀窍在
task.user = models.Author.objects.get(user=self.request.user)
由于绝望的复制粘贴,它失败了。问题是我的任务模型没有user
属性,而是author
。所以
task.author = models.Author.objects.get(user=self.request.user)
解决了这一切。
抱歉这个愚蠢的问题。