Django 无法将表单字段的选择限制为特定用户

Django 无法将表单字段的选择限制为特定用户,django,Django,正如标题所述,我无法根据特定用户限制表单字段的选择。例如,在表单登记字段的选项中,所有“乘客”都可供所有“用户”选择,而不仅仅是用户“拥有”的“乘客” 我已经尝试过这一点,以及其他一些可能的解决方案,这些解决方案处理m2m模型字段,限制了选择,但没有成功 如有任何建议,将不胜感激 models.py class Event(models.Model): id = models.AutoField(primary_key=True) title = models.CharField

正如标题所述,我无法根据特定用户限制表单字段的选择。例如,在表单登记字段的选项中,所有“乘客”都可供所有“用户”选择,而不仅仅是用户“拥有”的“乘客”

我已经尝试过这一点,以及其他一些可能的解决方案,这些解决方案处理m2m模型字段,限制了选择,但没有成功

如有任何建议,将不胜感激

models.py

class Event(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=200, null=True)
    description = models.TextField(max_length=255, null=True, blank=True)
    start = models.DateTimeField(null=True, blank=True)
    end = models.DateTimeField(null=True, blank=True)
    enrolled = models.ManyToManyField('riders.Rider', 
               related_name='events', blank=True)

    def __str__(self):
        return self.title
model.py(不同的应用程序)

views.py

@login_required
def enroll(request, event_id):
    event = Event.objects.get(id=event_id)

    if request.method != 'POST':
        form = EventForm(instance=event)
    else:
        form = EventForm(instance=event, data=request.POST)
        if form.is_valid():
            enroll = form.save(commit=False)
            enroll.save()
            form.save_m2m()

        return HttpResponseRedirect(reverse('riding_schedule:view_events'))
forms.py

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'enrolled']
        labels = {'text':''}
        widgets = {

            'enrolled': forms.CheckboxSelectMultiple()
        }
您可以这样尝试:

class EventForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(EventForm, self).__init__(*args, **kwargs)
        if user:
           self.fields['enrolled'].queryset = Rider.objects.filter(owner=user)  # overriding the queryset for enrolled here

    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'enrolled']
        labels = {'text':''}
        widgets = {

            'enrolled': forms.CheckboxSelectMultiple()
        }
首先,在启动表单时将当前用户信息发送到表单:

@login_required
def enroll(request, event_id):
    event = Event.objects.get(id=event_id)
    if request.method != 'POST':
        form = EventForm(instance=event, user=request.user)  # <-- Here
    else:
        form = EventForm(instance=event, data=request.POST)
    # ....

谢谢成功了!我真的很感谢你抽出时间来帮助我。我试图对你的答案投赞成票,但我缺少代表。再次感谢你。
class EventForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(EventForm, self).__init__(*args, **kwargs)
        if user:
           self.fields['enrolled'].queryset = Rider.objects.filter(owner=user)  # overriding the queryset for enrolled here

    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'enrolled']
        labels = {'text':''}
        widgets = {

            'enrolled': forms.CheckboxSelectMultiple()
        }