首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据登录的用户限制ManyToMany字段中的选择?

如何根据登录的用户限制ManyToMany字段中的选择?
EN

Stack Overflow用户
提问于 2019-01-09 08:05:14
回答 2查看 341关注 0票数 0

我希望视图只显示当前用户创建的"personajes“。

如果我没有理解错,我要做的就是在呈现表单之前,根据当前登录的用户来过滤选择。我想我要编辑的是ModelChoiceField(**kwargs)中的queryset参数,但我不知道该在哪里编辑。

models.py

代码语言:javascript
运行
复制
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Autor(models.Model):
    nombre = models.CharField(max_length=40)
    apellido = models.CharField(max_length=40)
    usuario = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)
    def __str__(self):
        return "%s %s" % (self.nombre, self.apellido)

class Personaje(models.Model):
    nombre = models.CharField(max_length=40)
    personalidad = models.CharField(max_length=20)
    creador = models.ForeignKey(Autor, on_delete=models.CASCADE)
    def __str__(self):
        return "nombre: %s Creador: %s" % (self.nombre, self.creador)


class Historia(models.Model):
    autor = models.ForeignKey(Autor, on_delete=models.CASCADE)
    personajes = models.ManyToManyField(Personaje)
    desarrollo = models.TextField()

views.py

我还没有简单地捕捉到request.user.id (我真的被过滤器之类的东西卡住了),我知道怎么做,硬编码用户id就可以了。

代码语言:javascript
运行
复制
from django.shortcuts import render
from django.views.generic import CreateView
from core.models import Historia
# Create your views here.

class CrearHistoria(CreateView):
    model = Historia
    fields = ['personajes', 'desarrollo']
    template_name = 'core/crear_historia.html'

当前结果:

我想要实现的是:

EN

Stack Overflow用户

回答已采纳

发布于 2019-01-19 23:39:00

这几天我一直在苦苦挣扎,但这是我的解决方案。

代码语言:javascript
运行
复制
from django.shortcuts import render
from django.views.generic import CreateView
from core.models import Historia, Personaje
# Create your views here.

class CrearHistoria(CreateView):
    model = Historia
    fields = ['personajes', 'desarrollo']
    template_name = 'core/crear_historia.html'
    def get_form(self, form_class=None):
        """Return an instance of the form to be used in this view."""
        if form_class is None:
            form_class = self.get_form_class()
            my_form_class = form_class(**self.get_form_kwargs())
            my_form_class['personaje'].field.queryset = Personaje.objects.filter(autor__id=2)
            return my_form_class

我是如何得到这个解决方案的: queryset在这里,我发现需要定义How do I filter ForeignKey choices in a Django ModelForm?属性。和here (这个web太棒了)我发现我可以访问由CreateView实例化的表单。

但是最困难的部分是找到正确的语法来定义查询集,所以在搜索了很多次之后,我决定自己去做:

代码语言:javascript
运行
复制
def get_form(self, form_class=None):
    """Return an instance of the form to be used in this view."""
    if form_class is None:
        form_class = self.get_form_class()
        my_form_class = form_class(**self.get_form_kwargs())
        print("Las variables son: ", vars(my_form_class))
        print("Las variables son:", vars(my_form_class['personaje'].field))
        print("El valor del atributo es:", my_form_class['personaje'].field.queryset)
        my_form_class['personaje'].field.empty_label = '(No hay selecciones)'
        my_form_class['personaje'].field.queryset = Personaje.objects.filter(autor__id=2)
        return my_form_class

如果您需要按用户过滤,则需要将self.request.user.id值传递给filter方法。

以下是打印输出:

Las变量son:{'instance':,'_validate_unique':False,'is_bound':False,'data':{},'files':{},'auto_id':'id_%s','initial':{},'error_class':,'label_suffix':':','empty_permitted':False,‘_error’:None,'fields':OrderedDict(('titulo',),('autor',),('personaje',),('desarrollo',)),‘_bound_field_cache’:{},'renderer':} Las变量son:{'empty_label':‘-’,'required':True,'label':'Personaje','initial':None,'show_hidden_initial':False,'help_text':'','disabled':False,'label_suffix':None,‘'localize':False,'widget':,'error_messages':{'required':'Este campo es equalatorio.’,'invalid_choice':'Seleccione unaón válida。可丢弃的选项。‘},’验证器‘:[],’查询集‘:,]>,'limit_choices_to':{},'to_field_name':'id'} El valor del atributo to es:,]>

我希望这能帮助任何需要在EditView中做一点修改的人。最后,谢谢你之前的回答,但这不是我想要的。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54101509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档