2016-08-10 4 views
0

Ich arbeite derzeit an dem folgenden Problem: Der Benutzer kann auf die Seite test.com/BlogPostTitle zugreifen. Wo BlogPostTitle ist ein Slug. Wenn ein Blogpost mit dem passenden Titel existiert, sollte Django die Detailansicht des besagten Blogposts rendern. Wenn es nicht existiert, sollte Django ein Formular zum Erstellen eines Blogposts rendern.Django Zugriff request.user in der klassenbasierten Ansicht

Das funktioniert so weit:

def check_user_editor(user): 
    if user: 
     return user.groups.filter(name="editor").exists() # Returns true, if user in editor group 
    else: 
     return False⋅ 

Wie können Sie:

class EntryDetail(DetailView): # Displays blog entry, if it exists 
    model = Blog 
    slug_field = 'title' 
    template_name = 'app/entry.html'  

class EntryForm(FormView): # Displays form, if entry 404s 
    template_name = 'app/create.html' 
    form_class = EntryForm 
    success_url = '/' 

    def form_valid(self, form): 
     form.save() 
     return super(EntryForm, self).form_valid(form) 

class EntryDisplay(View): 
    def get(self, request, *args, **kwargs): 
     try: 
      view = EntryDetail.as_view() 
      return view(request, *args, **kwargs) 
     except Http404: 
      if check_user_editor(self.request.user) == True: # Fails here 
       view = EntryForm.as_view() 
       return view(request, *args, **kwargs) 
      else: 
       pass 

nun nur Benutzer, die in der Gruppe "Editor" sind, sollten Sie das Formular/erstellen einen Beitrag zu sehen, der Lage sein, siehe, ich habe die Funktion in EntryDisplay implementiert, jedoch Django-Fehler 'User' object is not iterable.

Ich schätze, ich muss mit SingleObjectMixin arbeiten, aber ich habe die Dokumente nicht ganz verstanden.

Jede Hilfe würde sehr geschätzt werden.

Vollzurückverfolgungs:

Traceback:

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/detail.py" in get_object 
    53.    obj = queryset.get() 

File "/home/django/local/lib/python3.4/site-packages/django/db/models/query.py" in get 
    385.     self.model._meta.object_name 

During handling of the above exception (Blog matching query does not exist.), another exception occurred: 

File "/home/django/mediwiki/mediwiki/views.py" in get 
    68.    return view(request, *args, **kwargs) 

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch 
    88.   return handler(request, *args, **kwargs) 

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/detail.py" in get 
    115.   self.object = self.get_object() 

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/detail.py" in get_object 
    56.       {'verbose_name': queryset.model._meta.verbose_name}) 

During handling of the above exception (No blog found matching the query), another exception occurred: 

File "/home/django/local/lib/python3.4/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/home/django/local/lib/python3.4/site-packages/django/core/handlers/base.py" in _legacy_get_response 
    249.    response = self._get_response(request) 

File "/home/django/local/lib/python3.4/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/home/django/local/lib/python3.4/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 

File "/home/django/local/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch 
    88.   return handler(request, *args, **kwargs) 

File "/home/django/mediwiki/mediwiki/views.py" in get 
    74.     view = HttpResponse(request.user) 

File "/home/django/local/lib/python3.4/site-packages/django/http/response.py" in __init__ 
    293.   self.content = content 

File "/home/django/local/lib/python3.4/site-packages/django/http/response.py" in content 
    319.    content = b''.join(self.make_bytes(chunk) for chunk in value) 

File "/home/django/local/lib/python3.4/site-packages/django/utils/functional.py" in inner 
    235.   return func(self._wrapped, *args) 

Exception Type: TypeError at /test 
Exception Value: 'User' object is not iterable 
+1

Bitte aktualisieren Sie Ihre Frage mit dem vollständigen Zurückverfolgungs. – knbk

+0

@knbk Ja, natürlich. Ich hoffe das hilft. – theCed7

Antwort

0

Ihr Fehler ist in Zeile 74 in mediwiki.views:

view = HttpResponse(request.user) 

HttpResponse erwartet einen String oder ein iterable. Da request.user keine Zeichenfolge ist, wird versucht, sie als iterable zu verwenden, was fehlschlägt.

Ich kann nicht viel ohne den tatsächlichen Code sagen. Wenn in der Tat Sie wollen einfach nur eine String-Darstellung des Benutzers als Antwort zu senden, müssen Sie werfen in eine Zeichenfolge ist:

view = HttpResponse(str(request.user)) 
+0

Ah, bollocks! Stellt sich heraus, was für Debug-Zwecke hinzugefügt wurde, verursachte tatsächlich einen Fehler selbst. Ich wollte überprüfen, ob 'request.user 'überhaupt aufrufbar war und vergessen hat, es zu zeichnen. Guter Fang, vielen Dank! – theCed7

0

Ist der Fehler bei Vorlage Rendering aufgetreten? Wenn ja, frage ich mich, ob Sie Attribute über ein einzelnes User Objekt erstellt haben. Ich denke, Sie brauchen möglicherweise user.values().

BTW, sollten check_user_editor einfacher sein:

def check_user_editor(user): 
    return user.groups.filter(name="editor").exists() 
Verwandte Themen