如何记录根据唯一用户在ManyToMany字段中的限制选择?

时间:2019-01-09 00:05:14

标签: python django

我希望该视图仅显示当前用户创建的“角色”。 如果我不理解错误,我需要做的就是在表单呈现之前过滤选择,具体取决于当前登录的用户是谁。 我猜我需要编辑的是queryset中的ModelChoiceField(**kwargs)参数,但是我不知道该在哪里执行此操作。

models.py

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进行硬编码就可以了。

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'

当前结果:

What I have:

我要完成的事情:

the red rectangle are the options that must appear

非常感谢您的宝贵时间,以及解决该问题的更多信息,请问我!

2 个答案:

答案 0 :(得分:0)

指定表单并添加此清除方法:

def clean_personajes(self):
    count = 5 # set count
    personajes = self.cleaned_data.get("personajes")
    if personajes.count() > count:
        raise forms.ValidationError("Please select at-most {}.".format(count))
    return personajes

答案 1 :(得分:0)

这几天我一直在挣扎,但这是我的解决办法。

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

我如何提出此解决方案的: How do I filter ForeignKey choices in a Django ModelForm?在这里,我发现需要定义queryset属性。 here(这个网站很棒)我发现我可以访问由CreateView实例化的表单。

但是最困难的部分是找到正确的语法来定义查询集,因此经过大量搜索后,我决定自行完成:

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值传递给过滤方法。

以下是打印输出:

Las变量子级:{'instance':,'_validate_unique':False,'is_bound':False,'data':{},'files':{},'auto_id':'id_%s','初始”:{},“ error_class”:,“ label_suffix”:“:”,“ empty_permitted”:False,“ _ errors”:无,“字段”:OrderedDict([('titulo',),('autor', ),('personaje',),('desarrollo',)]),'_bound_fields_cache':{},'renderer':} Las变量子:{'empty_label':'---------','required':True,'label':'Personaje','initial':无,'show_hidden_​​initial':False,'help_text' :'','disabled':False,'label_suffix':无,'localize':False,'widget':,'error_messages':{'required':'Este campo es obligatorio。','invalid_choice':'Seleccione在瓦利达。 },“验证者”:[],“ _ queryset”:、、>,“ limit_choices_to”:{},“ to_field_name”:“ id”} El valor del atributo es:,]>

我希望这可以对需要在EditView中进行少许修改的所有人有所帮助。 最后,感谢您以前的回答,但这不是我想要的。