我想在下拉列表中列出所有活跃用户。但是所有用户都在下拉列表中列出我该怎么做呢?
模板
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<input type="hidden" name="customer_id" value="{{ customer.id }}">
<button type="submit" class="btn btn-primary btn-sm">Assign</button>
</form>
class AssignForm(forms.ModelForm):
class Meta:
model = Customer
fields = ('user',)
form = AssignForm(request.POST or None)
if request.POST:
customer_id = request.POST.get('customer_id', None)
customer = Customer.objects.get(id=customer_id)
user = UserProfile.objects.get(id=request.POST.get('user', None))
customer.user = user
customer.save()
# form.save()
return redirect('user:customer_list')
class UserProfile(AbstractUser, UserMixin):
company = models.ForeignKey(CompanyProfile, on_delete=models.CASCADE, null=True, unique=False)
username = models.CharField(max_length=500, unique=True)
first_name = models.CharField(max_length=200)
...
您可以使用以下命令过滤assignForm
中的user
字段:
class AssignForm(forms.ModelForm):
user = forms.ModelChoiceField(
queryset=UserProfile.objects.filter(is_active=True)
)
class Meta:
model = Customer
fields = ('user',)
您还可以在模型级别使用:
过滤它:class Customer(models.Model):
user = models.OneToOneField(
'UserProfile',
limit_choices_to={'is_active': True}
)
在这种情况下,您不需要在ModelForm
(s)中指定此。
我强烈建议您在POST请求中使用表单来创建实例,因此:
customer_id = request.POST.get('customer_id')
if customer_id:
instance = get_object_or_404(Customer, id=customer_id)
else:
instance = None
if request.method == 'POST':
form = AssignForm(request.POST, instance=instance)
if form.is_valid():
form.save()
return redirect('user:customer_list')
# …
您可以创建一个新的模型ActiveUser
,并对其施加一个过滤器(参见https://www.django-rest-framework.org/api-guide/filtering/),具体取决于"活动"的内容。在你的情况下意味着。