Django用户身份验证和呈现由该特定用户创建的内容?

时间:2012-04-20 03:07:50

标签: python django authentication

我正在创建一个非常简单的待办事项列表应用程序。每个用户都应该有一个关联的待办事项列表页面,其中包含基本的CRUD功能。这意味着用户A 应该具有与用户B 不同的数据。

截至目前,谁拥有待办事项清单没有区别。登录的任何人都可以添加,删除,显示,删除任务。

我有一种直觉,我可能需要在我的模型和模板中添加额外的东西。我应该提一下,我使用的是Pinax 0.9a2。如果它做了我需要它做的事情,我宁愿使用那个解决方案。

这是我的models.py

class Task(models.Model):
    name = models.CharField(max_length=100)
    added_at = models.DateTimeField(auto_now_add=True)
    last_update = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.name

以下是views.py

中的一个表单
def task_create(request):
    return create_object(request,
        model=Task,
        template_name='task_create.html',
        post_save_redirect=reverse("todo_list")
    )

这是我的两个模板:

待办事项制作

 <form action="" method="post">{% csrf_token %}
        {{ form.name }}
        <button type="submit" class="btn primary">Create &rarr;</button>
    </form>

待办事项列表

{% if task_list %}
    <p><a href="{% url task_create %}">Create a task</a></p>
    <ul>
    {% for task in task_list %}
        <li><a href="{% url task_detail task.id %}">{{ task.name }}</a></li>
    {% endfor %}
    </ul>
    {% else %}
        <p>No tasks to display, click to <a href="{% url task_create %}">create new</a>.</p>
    {% endif %}

1 个答案:

答案 0 :(得分:3)

所以你只想为它添加访问控制?

  1. ForeignKey添加到auth.User到您的ToDos模型
  2. 重写您的列表并创建视图以手动完成工作(您可以使用基于类的新视图实现目标,但您需要了解它们如何先工作)
  3. 在列表视图中为查询集添加过滤器
  4. 为表单commit=False提供save(),为检索到的对象设置用户并手动保存
  5. 代码:

    class Task(models.Model):
        user = models.ForeignKey('auth.User')
        name = models.CharField(max_length=100)
        added_at = models.DateTimeField(auto_now_add=True)
        last_update = models.DateTimeField(auto_now=True)
    
    class TaskForm(forms.ModelForm):
        class Meta:
            model = Task
            exclude = ['user', ]
    
    def task_create(request):
        form = TaskForm(data=request.POST or None)
        if request.method == 'POST' and form.is_valid():
            task = form.save(commit=False)
            task.user = request.user
            task.save()
            return reverse("todo_list")
        return render(request,
            'task_create.html',
            {'form': form}
        )
    

    此外,在列表视图中按request.user添加过滤,我建议使用@login_required装饰器以避免未经授权的用户添加任务。