Ich habe vor kurzem von 1.4 - 1.11 (inkrementell) aktualisiert, und seit ich von 1.9 auf 1.10 gehe, habe ich ein Problem mit get_form(). Es scheint, dass mein Kontext keine "Form" enthält und wenn der Super get_context_data aufgerufen wird, versucht er einen leeren Aufruf get_form() an das Formular zu übergeben. Irgendeine Ahnung, warum das jetzt einen Fehler gibt?get_form wirft TypeError nach dem Upgrade von Django auf 1.10
Internal Server Error: /messages/threads/6/
Traceback (most recent call last):
File "C:\Users\LT\Envs\django111\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\core\handlers\base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\contrib\auth\decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\views\generic\base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\LT\111\project\messages\views.py", line 93, in dispatch
return super(MemoCreateView, self).dispatch(request, *args, **kwargs)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\views\generic\base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\views\generic\edit.py", line 213, in get
return super(BaseCreateView, self).get(request, *args, **kwargs)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\views\generic\edit.py", line 174, in get
return self.render_to_response(self.get_context_data())
File "C:\Users\LT\111\project\messages\views.py", line 96, in get_context_data
context = super(MemoCreateView, self).get_context_data(**kwargs)
File "C:\Users\LT\Envs\django111\lib\site-packages\django\views\generic\edit.py", line 93, in get_context_data
kwargs['form'] = self.get_form()
TypeError: get_form() takes exactly 2 arguments (1 given)
"GET /messages/threads/6/ HTTP/1.1" 500 113089
urls.py
from django.conf.urls import url, include
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView
from django.views.generic.base import RedirectView
from .models import *
from .views import *
urlpatterns = [
url(r'^$', login_required(RedirectView.as_view(url='/messages/threads/')), name='messages_index'),
url(r'^threads/$', login_required(ThreadListView.as_view()), name='messages_thread_index'),
url(r'^threads/create/$', login_required(ThreadCreateView.as_view()), name='messages_thread_create'),
url(r'^threads/to-user/(?P<user_id>[0-9]+)/create/$', login_required(PrepopulatedUserThreadCreateView.as_view()), name='messages_prepopulated_user_thread_create'),
url(r'^threads/to-group/(?P<group_id>[0-9]+)/create/$', login_required(PrepopulatedGroupThreadCreateView.as_view()), name='messages_prepopulated_group_thread_create'),
url(r'^threads/(?P<thread_id>[0-9]+)/$', login_required(MemoCreateView.as_view()), name='messages_memo_index'),
url(r'^ajax/search/$', login_required(SearchView.as_view()), name='messages_ajax_search'),
url(r'^ajax/queue/$', login_required(QueueView.as_view()), name='messages_ajax_queue'),
]
views.py
class MemoCreateView(CreateView):
model = Memo
form_class = MemoForm
def dispatch(self, request, *args, **kwargs):
self.thread = Thread.objects.get(id=kwargs['thread_id'])
if not user_has_permission(request.user, self.thread, 'can_message'):
raise PermissionDenied('You do not have permission to view this thread.')
self.thread.read_by_role.users.add(request.user)
return super(MemoCreateView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(MemoCreateView, self).get_context_data(**kwargs)
context['thread'] = self.thread
context['participants_form'] = ThreadForm
return context
def get_form(self, form_class):
if self.thread:
if self.request.method == 'GET':
participants = self.thread.participant_role.users.all()
users_csv = ','.join([str(user.id) for user in self.thread.participant_role.users.all()])
return form_class({'participants': users_csv,})
'''
elif self.request.method == 'POST':
return form_class(self.request.POST, instance=self.shared_object)
else:
if self.request.method == 'POST':
return form_class(self.request.POST)
'''
return super(MemoCreateView, self).get_form(form_class)
def form_valid(self, form):
'''
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.thread = self.thread
self.object.save()
'''
memo = form.save(commit=False)
memo.author = self.request.user
memo.thread = self.thread
memo.save()
participants = []
participant_ids = form.cleaned_data['participants'].replace(' ', '').split(',')
for participant_id in participant_ids:
if participant_id:
participants.append(User.objects.get(id=participant_id))
groups = []
group_ids = form.cleaned_data['groups'].replace(' ', '').split(',')
for group_id in group_ids:
if group_id:
groups.append(Group.objects.get(id=group_id))
for group in groups:
if not user_has_permission(self.request.user, group, 'can_message'):
raise PermissionDenied('You do not have permission to message to the group "' + group.name + '"')
thread = memo.thread
#thread.subject = form.cleaned_data['subject']
thread.creator = self.request.user
thread.save()
thread.participant_role.users.add(*participants)
for group in groups:
thread.participant_role.users.add(*list(group.owner_role.users.all()))
thread.participant_role.users.add(*list(group.moderator_role.users.all()))
thread.participant_role.users.add(*list(group.member_role.users.all()))
self.success_url = thread.get_absolute_url()
return super(MemoCreateView, self).form_valid(form)
Problem Bibliothek Linien:
C:\Users\LT\Envs\django111\lib\site-packages\django\views\generic\edit.py in get_context_data
return self.render_to_response(self.get_context_data(form=form))
def get_context_data(self, **kwargs):
"""
Insert the form into the context dict.
"""
if 'form' not in kwargs:
kwargs['form'] = self.get_form() ...
return super(FormMixin, self).get_context_data(**kwargs)
class ModelFormMixin(FormMixin, SingleObjectMixin):
"""
A mixin that provides a way to show and handle a modelform in a request.
Ich habe versucht, den Blick auf
Ändern 10def get_form(self, form_class=None):
if form_class is None:
form_class = self.form_class
if self.thread:
if self.request.method == 'GET':
participants = self.thread.participant_role.users.all()
users_csv = ','.join([str(user.id) for user in self.thread.participant_role.users.all()])
return form_class({'participants': users_csv,})
'''
elif self.request.method == 'POST':
return form_class(self.request.POST, instance=self.shared_object)
else:
if self.request.method == 'POST':
return form_class(self.request.POST)
'''
return super(MemoCreateView, self).get_form(form_class)
wie in den Kommentaren vorgeschlagen, aber es ändert nichts. Es scheint, dass die django views-Bibliothek selbst eine get_form ohne Argumente aufruft - wie kann ich das verhindern?
Hat nicht funktioniert. Es scheint, dass 'Form' nicht in Kwargs ist, also, wenn es get_context_data super aufruft, ist es die leere get_form Klasse. Warum ist die Form nicht in Kwargen? – user1637466
Der ursprüngliche Fehler war, weil der Code namens 'self.get_form()' ohne irgendwelche Argumente, die nicht funktionierten, weil Sie 'def get_form (self, form_class):' '' 'form_class' erforderlich gemacht hatte. Wenn Sie Ihren Code wie oben geändert haben, funktioniert es möglicherweise nicht, aber ich würde eine andere Rückverfolgung erwarten. – Alasdair
Das Traceback war genau das gleiche – user1637466