使用查询集生成Django中IntegerField上的选择小部件的选项 [英] using a queryset to generate options for select widget on IntegerField in Django
问题描述
我正在尝试建立一个用户可以在其中拥有多个化身的网站,并选择他们要在进入房间时使用的化身。 (这将是一个掷骰子的应用程序。)我被困了三天,试图弄清楚如何将查询集传递到表单中,以用作IntegerField上选择小部件的选项。现在,我想我已经成功地将信息传递到了表单中,但是小部件中没有呈现任何内容。 (我什至有一份书面声明,向我自己证明信息已经进入。)
model.py
class EnterSWroom(models.Model):
room_number = models.IntegerField(blank = False)
passcode = models.CharField( max_length = 100,blank = True,null = True)
default_avatar = models.IntegerField(默认= 0)
forms.py
class Enter_SW_Room(forms.ModelForm):
类Meta:
模型= EnterSWroom
小部件= {'default_avatar':forms.Select(choices = [])}
字段=('room_number','passcode','default_avatar')
def __init __(自身,* args,** kwargs):
import_list = kwargs.pop('avatar_list')
super().__ init __(* args,** kwargs)
self.fields ['default_avatar']。choices = imported_list
print(self.fields ['default_avatar']。choices)#这仅用于调试;请参见下面的示例
views.py
class DockingBay(FormMixin,TemplateView):
form_class = Enter_SW_Room
def get_form_kwargs(self):
kwargs = super()。get_form_kwargs( )
#获取化身选择的元组
#获取用户名(如果存在),如果self.request.user.userprofile.user_first_name则使用用户名
:
user_name = self .request.user.userprofile.user_first_name
其他:
user_name = self.request.user.username
#实例化头像列表,从用户名
开始my_avatars = Avatar.objects。 filter(user_id = self.request.user.id)
my_avatars_choices = [(0,user_name)]
for my_avatars中的头像:
如果avatar.deleted!= 1:
my_avatars_choices.append((avatar.id,avatar.avatar_name))
kwargs ['avatar_list'] = my_avatars_choices
return kwargs
def get(self,request,* args,** kwargs):
kwargs = self.get_form_kwargs()
#为简洁而削减
form = Enter_SW_Room(** kwargs)
args = {'form':form,#从该示例中删除的其他args}
返回render(request,self.template_name,args)
...
打印示例: [(0,' Eric']]
但是,即使打印显示我已成功将查询集获取到表单,选择小部件也不显示任何内容。
预先感谢!
编辑以添加html模板的代码段:
< form method = post>
{%csrf_token%}
< table>
< col width = 240>
< col width = 120>
< tr>
< td>< strong>房间ID:< / strong>
< br>这将是一个数字。
< td> {{form.room_number}}< br>
< strong> {{form.room_number.errors}}< / strong>
< / td>
< / tr>
< tr>
< td>< strong>密码:< / strong>
< br>如果房间是空的,或者您曾经去过房间,请将此空白留空。< / td>
< td> {{form.passcode}}< br>
< strong> {{form.passcode.errors}}< / strong>
< / td>
< / tr>
< tr>
< td>< strong>头像:< / strong>
< br>选择您的头像。< / td>
< td> {{form.default_avatar}}< br>
< strong> {{form.default_avatar.errors}}< / strong>
< / td>
< / tr>
< / table>
< button type = submit>进入房间< / button>
< / form>
哦,我是个白痴。忘记定义表单中的字段。
已添加:
default_avatar = form.ChoiceField()
到表单。现在可以了。
I'm trying to make a site where users can have multiple avatars and pick the one they want to use when entering a room. (It will be a dice-rolling app.) I've been stuck for three days trying to figure out how to pass a queryset into a form to use as the options for a select widget that's on an IntegerField. Right now, I think I have successfully passed the information into the form, but nothing is rendering in the widget. (I've even got a print statement in the form to prove to myself that the information has made its way in.)
model.py
class EnterSWroom(models.Model):
room_number = models.IntegerField(blank=False)
passcode = models.CharField(max_length=100, blank=True, null=True)
default_avatar = models.IntegerField(default=0)
forms.py
class Enter_SW_Room(forms.ModelForm):
class Meta:
model = EnterSWroom
widgets = {'default_avatar': forms.Select(choices=[])}
fields = ('room_number', 'passcode', 'default_avatar')
def __init__(self, *args, **kwargs):
imported_list = kwargs.pop('avatar_list')
super().__init__(*args, **kwargs)
self.fields['default_avatar'].choices = imported_list
print(self.fields['default_avatar'].choices) #this is just for debugging; see example below
views.py
class DockingBay(FormMixin, TemplateView):
form_class = Enter_SW_Room
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
# get tuples for avatar choices
# get user first name (if exists), else use username
if self.request.user.userprofile.user_first_name:
user_name = self.request.user.userprofile.user_first_name
else:
user_name = self.request.user.username
# instantiate avatars list, start with user name
my_avatars = Avatar.objects.filter(user_id=self.request.user.id)
my_avatars_choices = [(0, user_name)]
for avatar in my_avatars:
if avatar.deleted != 1:
my_avatars_choices.append((avatar.id, avatar.avatar_name))
kwargs['avatar_list'] = my_avatars_choices
return kwargs
def get(self, request, *args, **kwargs):
kwargs = self.get_form_kwargs()
# cut for brevity
form = Enter_SW_Room(**kwargs)
args = {'form': form, # other args that were cut from this example}
return render(request, self.template_name, args)
...
Example of a print: [(0, 'Eric')]
But, even though the print suggests that I've successfully gotten the queryset to the form, the selection widget displays nothing.
Thanks in advance!
edit to add snippet of html template:
<form method="post">
{% csrf_token %}
<table>
<col width="240">
<col width="120">
<tr>
<td><strong>Room ID:</strong>
<br>This will be a number.</td>
<td>{{form.room_number}} <br>
<strong>{{ form.room_number.errors }}</strong>
</td>
</tr>
<tr>
<td><strong>Passcode:</strong>
<br>If the room is open, or you've been in it before, leave this blank.</td>
<td>{{form.passcode}} <br>
<strong>{{ form.passcode.errors }}</strong>
</td>
</tr>
<tr>
<td><strong>Avatar:</strong>
<br>Select your avatar.</td>
<td>{{form.default_avatar}} <br>
<strong>{{ form.default_avatar.errors }}</strong>
</td>
</tr>
</table>
<button type="submit">Enter Room</button>
</form>
Oh, I'm an idiot. Forgot to define the field in the form.
added:
default_avatar = forms.ChoiceField()
to the form. Now it works. Arrrrrgh!
这篇关于使用查询集生成Django中IntegerField上的选择小部件的选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!