【问题标题】:handling kwargs in POST and CBV在 POST 和 CBV 中处理 kwargs
【发布时间】:2018-10-24 16:26:48
【问题描述】:

在我的last question 中,我在选择小部件中显示导入的选项时遇到了麻烦,因为我遗漏了一段(应该是)明显的代码。现在,我的 GET(似乎)工作得很好。问题是我在 POST 中做错了什么。

我不知道应该如何在 POST 中处理 kwargs。如果我在我的 post 方法中包含 kwargs

form = Enter_SW_Room(request.POST, **kwargs)

我收到错误__init__() got multiple values for argument 'data'。环顾堆栈溢出,我发现这个错误的大部分问题源于在 super 中调用 self (或其他调用错误)。例如。这个problem / solution。如果我尝试通过不传递 kwargs 来解决此问题,验证将失败。 (我认为是因为现在有适当字段的值,但选择消失了。)

所以,我认为要么我正在做一些简单但重要的错误,要么我需要修改表单验证。 (或???)

这是所有代码(为简洁起见):

''' views.py '''
class DockingBay(FormMixin, TemplateView):
    form_class = Enter_SW_Room

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        # snip; create my_avatar_choices, which is more than just a queryset
        kwargs['avatar_list'] = my_avatars_choices
        return kwargs

    def get(self, request, *args, **kwargs):
        kwargs = self.get_form_kwargs()
        # snip
        my_rooms_list = []  # used in the template
        form = Enter_SW_Room(**kwargs)
        args = {'form': form, 'my_rooms_list': my_rooms_list}

        return render(request, self.template_name, args)

    def post(self, request, **kwargs):
        print(request.POST)
        kwargs = self.get_form_kwargs()
        form = Enter_SW_Room(request.POST, **kwargs)
        if form.is_valid():
            # snip - logic to enter the room with correct passcode
            return redirect('swdice:swroom', swroom_id)
        else:
            # snip - error handling will go here


'''forms.py'''
class Enter_SW_Room(forms.ModelForm):
    class Meta:
        model = EnterSWroom
        widgets = {'default_avatar': forms.Select()}
        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

    default_avatar = forms.ChoiceField(choices=[])


'''template'''
<h4>Enter a room using passcode</h4>
    <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 have 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>
    <hr>

【问题讨论】:

  • 顺便说一句,对于基于 Django 类的视图,您应该尽量避免覆盖 get()post()。您最终可能会重复代码或错过功能。如果你想要额外的代码,我会尝试使用FormView,并覆盖form_validform_invalid
  • 谢谢;我会仔细阅读的。

标签: python django django-forms


【解决方案1】:

您可以通过将代码更改为:

form = Enter_SW_Room(**kwargs)

你当前的代码相当于

form = Enter_SW_Room(data=request.POST, **kwargs)

由于kwargs 已经包含'data',您会收到多参数错误。

【讨论】:

  • 喂!简单,但很重要。谢谢!
猜你喜欢
  • 2016-07-28
  • 2016-04-11
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
相关资源
最近更新 更多