首页 > 解决方案 > 尝试向表单字段的标签添加链接时,__init __ () 出现意外的关键字参数“初始”错误

问题描述

当我尝试向 django UserCreationForm 字段的标签添加链接时,出现错误:

 __init__() got an unexpected keyword argument 'initial'.

我的代码如下所示:

#forms.py
class RegisterUserForm(UserCreationForm):
    email = forms.EmailField(required=True, label='Адрес электронной почты')
    check = forms.BooleanField()

    def __init__(self):
        super(RegisterUserForm, self).__init__()
        self.fields['check'].label = 'Принимаю политику конфиденциальности' % reverse('user:privacy')

    class Meta:
        model = AdvUser
        fields = ('username', 'email', 'password1', 'password2', 'check')

views.py 看起来像这样:

#views.py 
class RegisterUserView(SuccessMessageMixin, CreateView):
    model = AdvUser
    template_name = 'users/register_user.html'
    form_class = RegisterUserForm
    success_url = reverse_lazy('articles:list_view')
    success_message = 'Вы успешно зарегистрировались!'

    def form_valid(self, form):
        valid = super(RegisterUserView, self).form_valid(form)
        username, password = form.cleaned_data.get('username'), form.cleaned_data.get('password1')
        new_user = authenticate(username=username, password=password)
        login(self.request, new_user)
        return valid

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # 5 тегов с наибольшим количеством публикаций
        context['tags_list'] = Tag.objects.annotate(articles_quantiy=Count('taggit_taggeditem_items')).order_by(
            '-articles_quantiy')[:10]
        context['securities_types_list'] = StocksETFsBonds.objects.all()
        return context

添加 *args 和 **kwargs 后,def __init__我得到了如下所示的回溯:

Request Method: GET
Request URL: http://127.0.0.1:8000/accounts/register/

Traceback (most recent call last):
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\urls\base.py", line 71, in reverse
    extra, resolver = resolver.namespace_dict[ns]

During handling of the above exception ('user'), another exception occurred:
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\views\generic\base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\views\generic\base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\views\generic\edit.py", line 168, in get
    return super().get(request, *args, **kwargs)
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\views\generic\edit.py", line 133, in get
    return self.render_to_response(self.get_context_data())
  File "C:\Users\user\Desktop\django\sandbox\securities\website\users\views.py", line 139, in get_context_data
    context = super().get_context_data(**kwargs)
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\views\generic\edit.py", line 66, in get_context_data
    kwargs['form'] = self.get_form()
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\views\generic\edit.py", line 33, in get_form
    return form_class(**self.get_form_kwargs())
  File "C:\Users\user\Desktop\django\sandbox\securities\website\users\forms.py", line 71, in __init__
    self.fields['check'].label = 'Принимаю политику конфиденциальности' % reverse('user:privacy')
  File "C:\Users\user\Desktop\django\sandbox\securities\venv\lib\site-packages\django\urls\base.py", line 82, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)

Exception Type: NoReverseMatch at /accounts/register/
Exception Value: 'user' is not a registered namespace

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


这个错误是因为__init__now 不接受任何argsor kwargs

    def __init__(self): # Not expecting anything

argskwargs需要保留,所以只需将其更改为:

class RegisterUserForm(UserCreationForm):
    ...
    def __init__(self, *args, **kwargs): # Add back args and kwargs
        super(RegisterUserForm, self).__init__(*args, **kwargs) # And pass to parent

推荐阅读