python - 如何使 Django 下拉表单显示用户而非所有用户拥有的项目?

标签 python django-views django-forms

我无法显示仅由特定用户拥有的项目,而不是每个用户都可以查看数据库中的所有项目。下面是一个非 super 用户的示例,该用户有权访问我的数据库中的所有项目,而该用户只能访问他们创建的项目

image of dropdown menu with all items instead of just some

下面是我为尝试执行此操作而创建的表单、 View 和模型。

表单.py

class RoutineForm(forms.ModelForm):
"""creates a form for a routine"""
class Meta:
    model = Routine
    fields = ['workout']
    labels = {'workout': 'Workout'}

这是views.py

from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect, Http404
from django.urls import reverse
from django.contrib.auth.decorators import login_required
@login_required
def routine(request):
    """display a dropdown of all workouts for a user"""
    if request.method != 'POST':
        form = RoutineForm()
    else:
        form = RoutineForm(data=request.POST)
        if form.is_valid():
            new_routine = form.save(commit=False)
            new_routine.save()
            return redirect('index')
    context = {'workouts':workouts, 'form':form}
    return render(request, 'routine_workouts_app/routine.html', context)

最后是 models.py 文件

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Workout(models.Model):
    """A workout group the user will use to workout"""
    text = models.CharField(max_length=200) #titles should not be too long
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        """Return a string representation of the model"""
        return self.text


class Routine(models.Model):
    """Shows a routine"""
    workout = models.ForeignKey(Workout, on_delete=models.CASCADE)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return 'this is a routine'

我是否缺少某种过滤器?有什么基本的东西吗?我已经能够过滤我所做的一些其他 View 。例如:

@login_required
def workouts(request):
    """This is the page that will display all the workout groups"""
    workouts = Workout.objects.filter(owner=request.user).order_by('text') #filter by user ownership
    context = {'workouts': workouts}
    return render(request, 'routine_workouts_app/workouts.html', context)

在此代码段的第 4 行,我已成功过滤仅属于特定用户的项目。但这不是一个表单,只是一个html文件上的显示。我尝试在例程 View 函数中放置类似的行,但它不起作用。有什么建议吗?

最佳答案

您可以向 RoutineForm 的构造函数添加一个参数,该参数将过滤指定链接到 Workout 的查询集。这意味着表单看起来像:

class RoutineForm(forms.ModelForm):
    """creates a form for a routine"""
    
    def __init__(self, *args<strong>, user=None</strong>, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['workout'].queryset = Workout.objects<strong>.filter(owner=user)</strong>
    
    class Meta:
        model = Routine
        fields = ['workout']
        labels = {'workout': 'Workout'}

在 View 中,我们可以构造一个 Form ,将登录的用户传递给表单的构造函数:

from django.shortcuts import render, redirect
from django.http import HttpResponseRedirect, Http404
from django.urls import reverse
from django.contrib.auth.decorators import login_required

@login_required
def routine(request):
    """display a dropdown of all workouts for a user"""
    if request.method != 'POST':
        form = RoutineForm(<strong>user=request.user</strong>)
    else:
        form = RoutineForm(data=request.POST<strong>, user=request.user</strong>)
        if form.is_valid():
            form<strong>.instance.owner = request.user</strong>
            new_routine = form.save()
            return redirect('index')
    context = {'workouts':workouts, 'form':form}
    return render(request, 'routine_workouts_app/routine.html', context)

关于python - 如何使 Django 下拉表单显示用户而非所有用户拥有的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69169092/

相关文章:

python - 为什么在使用 execfile() 运行的 python 脚本中 import 不能防止 NameError?

Django - View 中的参数而不是网址中的参数

Django-注册限制为特定域电子邮件地址

python - 打印没有 unicode 的 python 字典

python - 使用间隔屏蔽 numpy 数组

python - 在Django中的html模式中加载动态数据

python - 如果将实例传递给表单,如何更改显示的字段?

python - 如何实现分类系统

python - 内核 pca 参数用法 : kernel and fit_inverse_transform

Django:从实际当前页面获取当前 url 路径