如何在Django modelform上应用过滤器并返回表单以在Django中查看?

时间:2019-02-27 08:52:03

标签: django django-2.0

我正在尝试以模型形式获取用户详细信息以创建一个Service对象。我不想在我的帐户应用中返回所有用户,而是希望在对象过滤器中应用自定义过滤器'is_admin = False',但这是返回用户而未应用过滤器。帮助我实现这一目标。...

forms.py

from django import forms
from .models import Service
from accounts.models import User

class AddServiceForm(forms.ModelForm):
    class Meta:
        model = Service
        fields = ['service','title','manager','serviceMobile','alternateMobile',
                  'latitude','longitude','city','street','landmark','keywords']

    def __init__(self, user, *args, **kwargs):
        super(AddServiceForm, self).__init__(*args, **kwargs)
        self.fields['manager'].queryset = User.objects.all().filter(is_admin=False)

views.py代码

class AddService(LoginRequiredMixin, LogoutIfNotAdminMixin, CreateView):
    login_url = reverse_lazy('mlogin')
    permission_required = 'is_staff'

    def post(self, request, *args, **kwargs):
        context={}
        context['city'] = City.objects.all()
        if request.method == 'POST':
            form = AddServiceForm(request.POST)
            if form.is_valid:
                form.save()
                return redirect('servicedata')
        else:
            form = AddServiceForm()
        return render(request, 'aapp/locations/service/uservicedata.html', {'form': form, 'context': context})

2 个答案:

答案 0 :(得分:0)

很抱歉让我感到困惑。但是在阅读了一些文档之后,我知道在__init__方法内,super应该在self.fields之后使用。

因此您的更改应类似于:

def __init__(self, user, *args, **kwargs):
    self.fields['manager'].queryset = User.objects.all().filter(is_admin=False)
    super(AddServiceForm, self).__init__(*args, **kwargs)

答案 1 :(得分:0)

我找到了这样的方式,同时可以在这样的模型字段中使用 limit_choices_to 来获取可以过滤的对象...

manager = models.ForeignKey(User, on_delete=models.PROTECT, limit_choices_to={'is_admin':False})