Django 限制从多个ForeignKey显示的选项

Django 限制从多个ForeignKey显示的选项,django,django-forms,Django,Django Forms,如何限制通过ManyToMany关系返回的值,从而将其显示在表单的字段中,以仅显示当前登录用户创建的点 models.py class Project(models.Model): owner = models.ForeignKey(User, editable=False) ... spots = models.ManyToManyField(to='Spot', blank=True, ) class Spot(models.Model):

如何限制通过ManyToMany关系返回的值,从而将其显示在表单的
字段中,以仅显示当前登录用户创建的点

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', )
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))
我正在使用GenericView进行更新和创建,在更新或创建项目时,当前可以看到每个人在Spot中创建的所有条目。我只想看到登录用户输入的条目。为完整起见,是的,
project.owner
spot.owner
在创建时被设置为User

我在forms.py中尝试了defINIT,并在模型中的manytoman字段上使用了limit_choices_to。要么我都做错了,要么那不是正确的方法

谢谢大家!

在您的表单中。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))
在您的视图中.py

user_id = Project.objects.get(owner=request.user).owner
project_form = ProjectForm(user_id)
spot_form = SpotForm(user_id)

正如我上面提到的,迪恩的回答非常接近,但对我来说并不奏效。主要是因为请求不能在视图中直接访问。也许是Django的旧版本?我在1点9分。谢谢你,迪恩,你帮我渡过了难关

其要点是将用户添加到视图中的kwargs中,将其传递到ModelForm,从kwargs中删除用户,并在显示表单之前使用它过滤斑点

这是为我的项目工作的代码:

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

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', )
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))

我想我们有不同的版本,因为你的答案不适合我,但它非常接近,逻辑是我需要看到的。主要问题是您不能像在genric视图中那样访问请求对象。您必须重写一个方法或其他东西,然后可以通过self.request访问它。我马上发布答案。我使用的是1.8,你使用的是基于类的视图,这就是为什么我在views.py中的方法与你的方法不一样。但很高兴看到你解决了这个问题。