我无法显示仅由特定用户拥有的项目,而不是每个用户都可以查看数据库中的所有项目。下面是一个非 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/