使用查询集生成Django中IntegerField上的选择小部件的选项 [英] using a queryset to generate options for select widget on IntegerField in Django

查看:90
本文介绍了使用查询集生成Django中IntegerField上的选择小部件的选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试建立一个用户可以在其中拥有多个化身的网站,并选择他们要在进入房间时使用的化身。 (这将是一个掷骰子的应用程序。)我被困了三天,试图弄清楚如何将查询集传递到表单中,以用作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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆