【问题标题】:How can I apply filter to Django modelform and return form to view in Django?如何将过滤器应用于 Django 模型并返回表单以在 Django 中查看?
【发布时间】:2019-02-27 08:52:03
【问题描述】:

我正在尝试以模型形式获取用户详细信息以创建 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})

【问题讨论】:

  • 对 init 方法进行更改后尝试重新启动服务器(manage.py runserver)

标签: django django-2.0


【解决方案1】:

对不起,我之前的困惑。但是看了一些文档后才知道,在__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)

【讨论】:

  • 这有区别吗?
  • all() 方法不保证每次都返回一个 QuerySet。另外,您为什么要调用所有对象并对它们执行过滤器?它只是增加了另一个方法调用。
  • @Aswin Murugesh 不,当然不会有任何区别
  • @Sanip 这不是查询集的工作方式——它们是惰性求值的,所以在all 之后调用filter 并没有什么区别,期望它删除不必要的函数调用和附加代码。跨度>
  • @bonidjukic 所以问题是只使用filter 方法还涉及调用 all() 方法和 filter() 方法?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2012-06-21
    • 2017-04-30
    • 1970-01-01
    • 2011-08-09
    • 2020-05-02
    • 2017-03-29
    • 2012-03-13
    相关资源
    最近更新 更多