Django ModelChoiceField获取连接用户的选择

2024-09-30 22:18:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个forms.ModelChoiceField,其中包含数据库中的项,但它显示了所有用户的数据。我只想显示连接用户的数据!谢谢你的帮助

我不需要创建模型。表单,因为我不想编辑或更新数据

views.py

def sms(request):
    form2 = ListDataForm()
    if request.method == 'POST':
        form2 = ListDataForm(request.POST)
        if form2.is_valid():
            message = form2.cleaned_data["message"]
            print(message)

    else:
        form2  = ListDataForm(request=request)
    return render(request, "data_list/sms.html", {"form2": form2})

型号.py

class List(models.Model):
    item = models.CharField(max_length=100)
    content = models.TextField()
    site = models.CharField(max_length=11, choices=THE_SITE)
    content_list = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.item

forms.py

class ListDataForm(forms.Form):

    message = forms.CharField(widget=forms.Textarea)
    listdata = forms.ModelChoiceField(queryset=List.objects.all())

我没有写forms.ModelChoiceField(queryset=List.objects.all()),而是写了forms.ModelChoiceField(queryset=List.objects.filter(author=request.user)),但它不起作用


Tags: 数据用户pymessageobjectsmodelsrequestdef
3条回答
  1. 使用get_queryset

    class ListDataForm(forms.Form):
    
        message = forms.CharField(widget=forms.Textarea)
        listdata = forms.ModelChoiceField(queryset=get_queryset)
    
        def get_queryset(request):
            return List.objects.filter(author=request.user)
    
    1. 调用表单时,将request作为参数传递

      def your_view(request):
          ...YOUR LOGIC...
          form = ListDataForm(request)
          ...YOUR LOGIC...
      

这种方法的问题在于queryset值是在类创建时执行的,也就是说,当您第一次启动Python解释器并加载所有Django内容时。request对象不是在这里创建的,而是在您开始从用户获取请求后创建的

根据documentation,您可以在类实例化时执行此操作,将queryset参数设置为None并写入

forms.py

class ListDataForm(forms.Form):
  ...
  listdata = forms.ModelChoiceField(queryset=None)
  ...

  def __init__(self, *args, **kwargs):
    request = kwargs.pop('request', None)
    super().__init__(*args, **kwargs)
    if request:
      user = request.user
      self.fields['listdata'].queryset = List.objects.filter(author=user)

然后,在您看来,按如下方式创建此表单

views.py

def form_view(request):
  ...
  form = ListDataForm(request=request)
  ...

根据the documentation限制ModelChoiceFields查询集的正确方法如下所示

# in your form
class ListDataForm(forms.Form):    
    message = forms.CharField(widget=forms.Textarea)
    listdata = forms.ModelChoiceField(queryset=List.objects.all())

def __init__(self, *args, user=None, **kwargs):
    super().__init__(*args, **kwargs)
    if user:
        listdata = self.fields['listdata']
        listdata.queryset = listdata.queryset.filter(author=user)


# in your view
...
form = ListDataForm(data, ..., user=request.user)

相关问题 更多 >