限制 ManyToMany ForeignKey 显示的选项
Limit the Choices shown from ManyToMany ForeignKey
如何限制通过 ManyToMany 关系返回的值并因此显示在我表单的 <SELECT>
字段中以仅显示当前登录用户创建的点?
models.py
class Project(models.Model):
owner = models.ForeignKey(User, editable=False)
...
spots = models.ManyToManyField(to='Spot', blank=True, )
class Spot(models.Model):
owner = models.ForeignKey(User, editable=False)
spot_name = models.CharField(max_length=80, blank=False)
forms.py
from django import forms
from .models import Project, Spot
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ('owner', )
class SpotForm(forms.ModelForm):
class Meta:
model = Spot
exclude = ('owner', )
我正在使用 GenericViews 进行更新和创建,目前在我更新或创建项目时,可以看到每个人在 Spots 中所做的所有条目。我只想查看登录用户输入的条目。为了完整起见,是的,project.owner
和 spot.owner
在创建时被设置为用户。
我已经尝试在 forms.py 中使用 def INIT 并在模型的 manytomany 字段上使用 limit_choices_to 。要么我做错了,要么那不是正确的方法。
谢谢!
在你的forms.py
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ('owner', )
def __init__(self, user_id, *args, **kwargs):
self.fields['spots'] = forms.ModelChoiceField(widget=forms.Select, queryset=Project.objects.filter(owner=user_id))
class SpotForm(forms.ModelForm):
class Meta:
model = Spot
exclude = ('owner', )
def __init__(self, user_id, *args, **kwargs):
self.fields['spot_name'] = forms.ModelChoiceField(widget=forms.Select, queryset=Spot.objects.filter(owner=user_id))
在你的 views.py
user_id = Project.objects.get(owner=request.user).owner
project_form = ProjectForm(user_id)
spot_form = SpotForm(user_id)
正如我上面提到的,Dean 的回答非常接近,但对我不起作用。主要是因为无法直接在视图中访问请求。也许它在旧的 Django 版本中?我在1.9。谢谢 Dean,你让我渡过了难关!
要点是将 User 添加到视图中的 kwargs 中,将其传递给 ModelForm,从 kwargs 中删除 User 并使用它在显示表单之前过滤 Spots。
这是适用于我的项目的代码:
views.py
class ProjectUpdate(UpdateView):
model = Project
success_url = reverse_lazy('projects-mine')
form_class = ProjectForm
def dispatch(self, *args, **kwargs):
return super(ProjectUpdate, self).dispatch(*args, **kwargs)
def get_form_kwargs(self):
kwargs = super(ProjectUpdate, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
forms.py
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ('owner', 'whispir_id')
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user')
super(ProjectForm, self).__init__(*args, **kwargs)
self.fields['spots'] = forms.ModelMultipleChoiceField(queryset=Spot.objects.filter(owner=user_id))
class SpotForm(forms.ModelForm):
class Meta:
model = Spot
exclude = ('owner', )
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user')
super(SpotForm, self).__init__(*args, **kwargs)
self.fields['spot_name'] = forms.ModelMultipleChoiceField(queryset=Spot.objects.filter(owner=user_id))
如何限制通过 ManyToMany 关系返回的值并因此显示在我表单的 <SELECT>
字段中以仅显示当前登录用户创建的点?
models.py
class Project(models.Model):
owner = models.ForeignKey(User, editable=False)
...
spots = models.ManyToManyField(to='Spot', blank=True, )
class Spot(models.Model):
owner = models.ForeignKey(User, editable=False)
spot_name = models.CharField(max_length=80, blank=False)
forms.py
from django import forms
from .models import Project, Spot
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ('owner', )
class SpotForm(forms.ModelForm):
class Meta:
model = Spot
exclude = ('owner', )
我正在使用 GenericViews 进行更新和创建,目前在我更新或创建项目时,可以看到每个人在 Spots 中所做的所有条目。我只想查看登录用户输入的条目。为了完整起见,是的,project.owner
和 spot.owner
在创建时被设置为用户。
我已经尝试在 forms.py 中使用 def INIT 并在模型的 manytomany 字段上使用 limit_choices_to 。要么我做错了,要么那不是正确的方法。
谢谢!
在你的forms.py
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ('owner', )
def __init__(self, user_id, *args, **kwargs):
self.fields['spots'] = forms.ModelChoiceField(widget=forms.Select, queryset=Project.objects.filter(owner=user_id))
class SpotForm(forms.ModelForm):
class Meta:
model = Spot
exclude = ('owner', )
def __init__(self, user_id, *args, **kwargs):
self.fields['spot_name'] = forms.ModelChoiceField(widget=forms.Select, queryset=Spot.objects.filter(owner=user_id))
在你的 views.py
user_id = Project.objects.get(owner=request.user).owner
project_form = ProjectForm(user_id)
spot_form = SpotForm(user_id)
正如我上面提到的,Dean 的回答非常接近,但对我不起作用。主要是因为无法直接在视图中访问请求。也许它在旧的 Django 版本中?我在1.9。谢谢 Dean,你让我渡过了难关!
要点是将 User 添加到视图中的 kwargs 中,将其传递给 ModelForm,从 kwargs 中删除 User 并使用它在显示表单之前过滤 Spots。
这是适用于我的项目的代码:
views.py
class ProjectUpdate(UpdateView):
model = Project
success_url = reverse_lazy('projects-mine')
form_class = ProjectForm
def dispatch(self, *args, **kwargs):
return super(ProjectUpdate, self).dispatch(*args, **kwargs)
def get_form_kwargs(self):
kwargs = super(ProjectUpdate, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
forms.py
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ('owner', 'whispir_id')
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user')
super(ProjectForm, self).__init__(*args, **kwargs)
self.fields['spots'] = forms.ModelMultipleChoiceField(queryset=Spot.objects.filter(owner=user_id))
class SpotForm(forms.ModelForm):
class Meta:
model = Spot
exclude = ('owner', )
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user')
super(SpotForm, self).__init__(*args, **kwargs)
self.fields['spot_name'] = forms.ModelMultipleChoiceField(queryset=Spot.objects.filter(owner=user_id))