将表单字段设置为当前记录的用户ID

时间:2014-06-02 00:23:08

标签: django django-forms

我有一个具有以下实现的类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_kwargsform_validget_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/吗?感谢。

1 个答案:

答案 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)

解决了这一切。

抱歉这个愚蠢的问题。