[英]Show different QuerySet in a ModelMultipleChoice depending in previously selected option in another ModelMultipleChoice
I'm trying to build a simple Django webApp that stores documents in the server and it makes a relationship between the document and a project. 我正在尝试构建一个简单的Django webApp,该服务器将文档存储在服务器中,并在文档和项目之间建立关系。
Here are my models: 这是我的模型:
class Project(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete='models.CASCADE', related_name='project_members')
project_members = models.ManyToManyField(settings.AUTH_USER_MODEL)
name = models.CharField(max_length=20, blank=False, null=False, unique=True)
def __str__(self):
return str(self.name)
class Document(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
path = models.FileField(upload_to='documents/')
name = models.CharField(max_length=50)
folders = models.ManyToManyField(Folder)
projects = models.ManyToManyField(Project)
def __str__(self):
return str(self.name)
Here is the code of the form: 这是表格的代码:
class RemoveFileProject(forms.Form):
project_name = forms.ModelMultipleChoiceField(queryset=Project.objects.none())
document_name = forms.ModelMultipleChoiceField(queryset=Document.objects.none(), widget=FilteredSelectMultiple("Documentos", is_stacked=False))
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super(RemoveFileProject, self).__init__(*args, **kwargs)
if user:
proyectos = Project.objects.filter(project_members=user)
print(proyectos)
self.fields['project_name'] = forms.ModelMultipleChoiceField(queryset=proyectos)
docs = Document.objects.filter(projects=proyectos).select_related()
self.fields['document_name'] = forms.ModelMultipleChoiceField(queryset=docs, widget=FilteredSelectMultiple("Documentos", is_stacked=False))
Now I have 2 problems: 现在我有两个问题:
I'm receiving a "ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing". 我收到“ ValueError:用于精确查找的QuerySet值必须限制为使用切片的一个结果”。 I understand that this is because proyectos is a QuerySet and they behave in unique ways but I'm having trouble to grasp how can I make a "join" in django. 我知道这是因为proyectos是QuerySet,它们的行为方式独特,但是我很难掌握如何在Django中进行“ join”。
I want to only show the documents that belong to each project, so If I choose the project "proyect 1", the second ModelMultipleChoiceFied should only display the documents that are related to "project 1". 我只想显示属于每个项目的文档,因此,如果选择项目“ proyect 1”,则第二个ModelMultipleChoiceFied应该只显示与“项目1”相关的文档。
Thanks in Advance 提前致谢
I would recommend looking into the Django Autocomplete Light (DAL) library, and specifically the forward
attribute for widgets ( https://django-autocomplete-light.readthedocs.io/en/master/tutorial.html?highlight=forward#filtering-results-based-on-the-value-of-other-fields-in-the-form ). 我建议您查看Django Autocomplete Light(DAL)库,尤其是小部件的forward
属性( https://django-autocomplete-light.readthedocs.io/en/master/tutorial.html?highlight=forward#filtering-基于表单中其他字段的值的结果 )。 Works very well for what you're asking! 非常适合您的要求!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.