2016-10-06 9 views
1

私は、ModelMultipleChoiceFieldを持つフォームで現在のユーザーを表示するためにrequest.userを渡したかったのです。私はここに私の問題を把握することができたhttps://stackoverflow.com/a/25184373/6568309。私は以下のように自分のコードを修正しました。Djangoクラスベースのビューを使用すると、どのようにrequest.user(現在ログインしているユーザー)をフォームに渡すことができますか?

が、私は唯一の機能ベースのビューで溶液を得ることができます。よく、クラスベースのビューを使用していました。なぜなら、ジェネリックビューを使用することができ、それが最初に推奨されたからです。 FormViewまたはModelFormViewを使用するために、クラスベースのビューで以下のようにrequest.userを渡す方法はありますか?さらに、Djangoのニーズを満たすために、関数ベースのビューとクラスベースのビューを混在させるのが普通ですか?

ありがとうございます。

forms.py

class CustomForm(forms.Form): 
    username = forms.CharField(initial='testname',max_length=150) 
    email = forms.EmailField() 
    phone_number = forms.CharField(max_length=15) 
    position = forms.CharField(max_length=15) 
    uperall = forms.ModelMultipleChoiceField(queryset=None) 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', None) 
     super(CustomForm, self).__init__(*args, **kwargs) 
     self.fields['uperall'].queryset = User.objects.filter(username=user.username) 

urls.py

urlpatterns = [ 
    url(r'^$', UserList.as_view(), name='index'), 
    url(r'^create/$', UserCreate.as_view(), name='create'), 
    url(r'^test/$', TestView.as_view(), name='test'), 
    url(r'^test1/$', views.ftestview, name='test1'), 
] 

views.py

def ftestview(request): 
    if request.method == 'POST': 

    form = CustomForm(request.POST, user=request.user) 

    if form.is_valid(): 
     username = form.cleaned_data['username'] 
     email = form.cleaned_data['email'] 
     phone_number = form.cleaned_data['phone_number'] 
     position = form.cleaned_data['position'] 

     with transaction.atomic(): 
      user = User.objects.create(username=username,email=email) 
      userinfo = UserInfo.objects.create(user=user,phone=phone_number,position=position) 
      userinfo.save() 
      user.save() 

     return HttpResponseRedirect('/success') 

else: 
    form = CustomForm(user=request.user) 

return render(request, 'manager/alltoall.html', { 'form': form }) 

thanksfullyレヴィからの回答に基づい。私は

class TestView(FormView): 
    form_class = CustomForm 
    template_name = 'manager/alltoall.html' 

    def get_form_kwargs(self): 
     user = self.request.user 
     form_kwargs = super(TestView, self).get_form_kwargs() 
     form_kwargs.update({'initial': {'uperall': User.objects.filter(username=user.username)}}) 
     return form_kwargs 

    def form_valid(self, form): 
     username = form.cleaned_data['username'] 
     email = form.cleaned_data['email'] 
     phone_number = form.cleaned_data['phone_number'] 
     position = form.cleaned_data['position'] 

     with transaction.atomic(): 
      user = User.objects.create(username=username,email=email) 
      userinfo = UserInfo.objects.create(user=user,phone=phone_number,position=position) 
      userinfo.save() 
      user.save() 

     return super(TestView, self).form_valid(form) 

views.py

以下のように私のコードを変更しますが、私は以下のようなエラーが発生しました。

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/manager/test/ 

Django Version: 1.10.1 
Python Version: 3.4.3 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'manager.apps.ManagerConfig', 
'mptt'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 


Template error: 
In template C:\Users\Jaemyun\django_real\apa\apa\manager\templates\manager\alltoall.html, error at line 9 
    'NoneType' object has no attribute 'all' 1 : <select multiple="multiple" data-field-name="groups"> 
    2 :  <option value="volvo">Volvo</option> 
    3 :  <option value="hyundai">Hyundai</option> 
    4 : </select> 
    5 : 
    6 : <form action="." method="post"> 
    7 : {% csrf_token %} 
    8 : <table> 
    9 : {{ form }} 
    10 :  </table> 
    11 :  <input type="submit" value="Submit" /> 
    12 : </form> 

Traceback: 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\core\handlers\exception.py" in inner 
    39.    response = get_response(request) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\core\handlers\base.py" in _get_response 
    217.     response = self.process_exception_by_middleware(e, request) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\core\handlers\base.py" in _get_response 
    215.     response = response.render() 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\response.py" in render 
    109.    self.content = self.rendered_content 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\response.py" in rendered_content 
    86.   content = template.render(context, self._request) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\backends\django.py" in render 
    66.    return self.template.render(context) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\base.py" in render 
    208.      return self._render(context) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\base.py" in _render 
    199.   return self.nodelist.render(context) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\base.py" in render 
    994.     bit = node.render_annotated(context) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\base.py" in render_annotated 
    961.    return self.render(context) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\base.py" in render 
    1050.   return render_value_in_context(output, context) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\template\base.py" in render_value_in_context 
    1028.  value = force_text(value) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\utils\encoding.py" in force_text 
    76.      s = six.text_type(s) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\utils\html.py" in <lambda> 
    391.   klass.__str__ = lambda self: mark_safe(klass_str(self)) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\forms.py" in __str__ 
    123.   return self.as_table() 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\forms.py" in as_table 
    271.    errors_on_separate_row=False) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\forms.py" in _html_output 
    226.      'field': six.text_type(bf), 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\utils\html.py" in <lambda> 
    391.   klass.__str__ = lambda self: mark_safe(klass_str(self)) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\boundfield.py" in __str__ 
    43.   return self.as_widget() 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\boundfield.py" in as_widget 
    101.   return force_text(widget.render(name, self.value(), attrs=attrs)) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\widgets.py" in render 
    610.   options = self.render_options(value) 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\widgets.py" in render_options 
    560.   for option_value, option_label in self.choices: 

File "C:\Users\Jaemyun\django_real\apa\myenv\lib\site-packages\django\forms\models.py" in __iter__ 
    1114.   queryset = self.queryset.all() 

Exception Type: AttributeError at /manager/test/ 
Exception Value: 'NoneType' object has no attribute 'all' 

答えて

3

あなたがフォームのinitalデータを設定するためにFormViewクラスビューからメソッドget_form_kwargsをオーバーライドすることができます。

class YouFormView(FormView): 
    teplate_name = 'your template' 
    form_class = YourForm 


    def get_form_kwargs(self): 
     user = self.request.user 
     form_kwargs = super(YouFormView, self).get_form_kwargs() 
     form_kwargs.update({ 
      'initial': { 
       'uperall': User.objects.filter(username=user.username) 
      } 
     }) 
     return form_kwargs 

ビューの混合について:私はクラスベースのビューに固執することをお勧めします。

+0

ありがとうございました。私は自分のコードにそれを適用しました。それは "NoneType"オブジェクトに属性 'all' "がないことが原因です。私はこのエラーの原因を突き止めています。私はテンプレートレンダリングの間に起こった。 – Jayground

+0

@JAEMYUNISGRANDPAあなたの質問にペーストエラーのトレース。 – levi

+0

エラートレースで質問を更新しました。 – Jayground

関連する問題