Как передать итерируемый список отфильтрованных пользователей в шаблоне Django с помощью формы?
У меня есть пользовательская модель пользователя, которая имеет дополнительные фильтры, чем стандартный Django User, а именно is_candidate
и is_voter
. Я хочу передать список всех тех пользователей, которые имеют is_candidate
как True
. Я попытался сделать форму таких пользователей и передать эту форму в шаблоне, но получаю следующую ошибку:
TypeError at /votes/
cannot unpack non-iterable User object
Request Method: GET
Request URL: http://localhost:8000/votes/
Django Version: 4.0.3
Exception Type: TypeError
Exception Value:
cannot unpack non-iterable User object
Exception Location: C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\django\forms\widgets.py, line 737, in _choice_has_empty_value
Python Executable: C:\Users\Admin\AppData\Local\Programs\Python\Python310\python.exe
Python Version: 3.10.4
Python Path:
['D:\\VU\\CS619\\BC170403979\\punjabbarcouncil',
'C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip',
'C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python310\\DLLs',
'C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python310\\lib',
'C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python310',
'C:\\Users\\Admin\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages']
Server time: Sun, 12 Jun 2022 10:19:32 +0000
Полная информация об ошибке такова:
Моя пользовательская User
модель выглядит следующим образом:
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=254, null=True, blank=True)
email = models.EmailField(max_length=254, unique=True)
first_name = models.CharField(max_length=254, null=True, blank=True)
last_name = models.CharField(max_length=254, null=True, blank=True)
pbc_id = models.CharField(max_length=254, null=True, blank=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_candidate = models.BooleanField(default=False)
is_voter = models.BooleanField(default=False)
votes = models.IntegerField(default=0)
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def get_absolute_url(self):
return "/users/%i/" % (self.pk)
Моим классом Manager UserManager
является:
class UserManager(BaseUserManager):
def _create_user(self, email, password, is_staff, is_superuser, is_candidate, is_voter, **extra_fields):
if not email:
raise ValueError('Users must have an email address')
now = timezone.now()
email = self.normalize_email(email)
user = self.model(
username=email,
email=email,
is_staff=is_staff,
is_active=True,
is_superuser=is_superuser,
is_candidate=is_candidate,
is_voter=is_voter,
last_login=now,
date_joined=now,
**extra_fields
)
user.set_password(password)
user.save(using=self._db)
user.pbc_id = "PBC-" + str(user.pk)
user.save(using=self._db)
return user
def create_user(self, email, password, **extra_fields):
user = self._create_user(email, password, False, False, False, False, **extra_fields)
user.save(using=self._db)
user.pbc_id = "PBC-" + str(user.pk)
user.save(using=self._db)
return user
Мой admin.py
это:
class UserAdmin(BaseUserAdmin):
fieldsets = (
(None, {'fields': ('username', 'email', 'password', 'first_name', 'last_name', 'last_login')}),
('Permissions', {'fields': (
'is_active',
'is_staff',
'is_superuser',
'is_candidate',
'is_voter',
'groups',
'user_permissions',
)}),
)
add_fieldsets = (
(
None,
{
'classes': ('wide',),
'fields': ('email', 'password1', 'password2')
}
),
)
list_display = ('username', 'email', 'first_name', 'last_name', 'pbc_id', 'is_staff', 'is_candidate', 'is_voter', 'last_login')
list_filter = ('is_staff', 'is_candidate', 'is_voter', 'is_superuser', 'is_active', 'groups')
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ('groups', 'user_permissions',)
def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
if obj.is_candidate:
obj.pbc_id = "PBC-C" + str(obj.pk)
elif obj.is_voter:
obj.pbc_id = "PBC-V" + str(obj.pk)
else:
obj.pbc_id = "CPBC-" + str(obj.pk)
obj.save()
Мой forms.py
это:
class CandidateForm(forms.Form):
candidate = forms.ChoiceField(choices=User.objects.all().filter(is_candidate=True))
Мой views.py
это:
def votes(request):
candidatesfm = CandidateForm(request.POST)
context = {
'candidatesfm': candidatesfm
}
if candidatesfm.is_valid():
candidate = candidatesfm.cleaned_data.get("candidate")
if candidate is not None:
print(candidate.votes)
return redirect("/pbcdashboard")
else:
print("Error")
return render(request, 'register/votes.html', context)
Мой шаблон votes.html
таков:
<form action="" method="post">
{% csrf_token %}
<div style="background-color: #34495E; padding: 50px; color: white;">
<div style="background-color: #34495E;">
{{ candidatesfm.as_p }}
</div>
</div>
<div align="center" style="padding: 50px;">
<input style="padding-top: 10px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; font-size: large;" type="submit" value="Check">
</div>
</form>
Любая помощь будет принята с благодарностью.