django - 根据登录用户过滤 django 表单中的下拉选项

标签 django django-forms

我有一个 django 表单来创建名为 Ticket 的类的新实例(记录) 。用户可以来自不同的clients所以我基本上需要将下拉列表中显示的选项限制为登录用户的客户端。 client是我在 admin.py 中定义的类的属性,它定义了 client user 的名称。我知道我走在正确的道路上,但我很难完成这项工作,因为我需要提取 client登录人数 User然后在初始化表单时使用它来过滤字段(例如 business ),任何帮助将不胜感激?请考虑到我有多个应该过滤的字段,因此如果有一种方法可以对所有字段执行一次此操作,那就太好了:

models.py

class Business(models.Model):
    client=models.ForeignKey('Client',on_delete=models.CASCADE, limit_choices_to={'is_active':True},)
    name=models.CharField(max_length=30,blank=False, unique=True,)
    description = models.CharField(max_length=50, blank=True, )
    is_active=models.BooleanField(default=True,)



class Ticket(MMRequestAttributes):    
    no=models.CharField('Ticket Number',max_length=50,default=uuid.uuid4,null=False, blank=False, editable=False, unique=True)
    subject=models.CharField('Subject',max_length=100,null=False, blank=False)
    business=models.ForeignKey('Business', on_delete=models.CASCADE,limit_choices_to={'is_active':True},)

    class Meta:
        permissions=(('view_ticket','Can see tickets'),)

views.py

def new_ticket(request):
    form=NewTicket(request.user)
    return render(request,'mmrapp/new_ticket.html',{'form':form})

admin.py

class UserExtend(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=False,null=False,)
    client=models.ForeignKey('Client', on_delete=models.CASCADE,limit_choices_to={'is_active': True},)

    class Meta:
        verbose_name_plural='User Extends'

forms.py

from django import forms
from .models import Ticket 
from .admin import UserExtend

class NewTicket(forms.ModelForm):

    def __init__(self,user):
        self.business.queryset=business.objects.filter(client.id=userextend.client_id)

    class Meta:
        model=Ticket
        fields = ('subject','business')

new-ticket.html

{% extends 'mmrapp/__l_single_column.html' %}
{% load static %}

{% block main_col %}
    <h1>New Ticket</h1>
    <form method="POST" class="new-ticket">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Submit</button>
    </form>
{% endblock main_col %}

最佳答案

你的做法是正确的,只需将__init__更改为此

class NewTicket(forms.ModelForm):

    def __init__(self,user, *args, **kwargs):
        super(NewTicket, self).__init__(*args, **kwargs)
        try:
            client_id = UserExtend.objects.values_list('client_id', flat=True).get(user=user)
            self.fields['business'].queryset=Business.objects.filter(client__id=client_id)
        except UserExtend.DoesNotExist:
            ### there is not userextend corresponding to this user, do what you want 
            pass


    class Meta:
        model=Ticket
        fields = ('subject','business')

另外,不要忘记将 request.user 传递到您 View 中的表单。

关于django - 根据登录用户过滤 django 表单中的下拉选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51939175/

相关文章:

python - 如何发送具有相同名称的多个输入字段值?

django - 当表单无效时, View 未返回 HttpResponse 对象错误 : django

python - Django 表单中的 "Plus"按钮 : user-added fields possible?

python - 控制 Django ModelForm 输出

django - 如何从Django管理员 View 链接到其他对象?

python - INSTALLED_APPS Django 限制中的唯一名称

python - django查询检索以父名称为键的子值字典?

python - 格式化 Django 中作为字符串提供的日期时间

php - 如何使用基于 HTML 的用户界面表示多对多记录的关系

django-forms - 使用文件字段编辑 Django 模型而不重新上传文件