2017-07-09 27 views
5

Próbuję zmodyfikować posty aplikację z Django Tutorial https://github.com/codingforentrepreneurs/Advancing-the-Blog/tree/master/src/postspobrać dane z formularza i wyświetlania w szablonie

tworzę nowe pole „userc” w forms.py:

userc = forms.ModelChoiceField(queryset=User.objects.filter(is_staff=True)) 

Próbowałem różnych metod, ale nie mogę wyświetlić wybranego użytkownika w szablonie.

Co powinienem dodać w views.py?

Edit: Próbowałem {{obj.userc}}, {{instance.userc}}, aby wyświetlić wybrany użytkownika w szablonach.

views.py

from django.contrib import messages 
from django.contrib.contenttypes.models import ContentType 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 

from django.db.models import Q 
from django.http import HttpResponse, HttpResponseRedirect, Http404 
from django.shortcuts import render, get_object_or_404, redirect 
from django.utils import timezone 

from comments.forms import CommentForm 
from comments.models import Comment 
from .forms import PostForm 
from .models import Post 

from django.contrib.auth.models import User 

def post_create(request): 
    if not request.user.is_staff or not request.user.is_superuser: 
     raise Http404 

    form = PostForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.user = request.user 
     instance.save() 
     # message success 
     messages.success(request, "Successfully Created") 
     return HttpResponseRedirect(instance.get_absolute_url()) 
    context = { 
     "form": form, 
    } 
    return render(request, "post_form.html", context) 





def abc(request): 

    if request.method == "POST": 
     #Get the posted form 
     form = PostForm(request.POST) 

     if form.is_valid(): 
     userc = form.cleaned_data['userc'] 
    return render(request, 'post_detail.html', {"selected_user" : userc}) 

















def post_detail(request, slug=None): 
    instance = get_object_or_404(Post, slug=slug) 
    if instance.publish > timezone.now().date() or instance.draft: 
     if not request.user.is_staff or not request.user.is_superuser: 
      raise Http404 
    share_string = quote_plus(instance.content) 




    initial_data = { 
      "content_type": instance.get_content_type, 
      "object_id": instance.id 
    } 
    form = CommentForm(request.POST or None, initial=initial_data) 
    if form.is_valid() and request.user.is_authenticated(): 
     c_type = form.cleaned_data.get("content_type") 
     content_type = ContentType.objects.get(model=c_type) 
     obj_id = form.cleaned_data.get('object_id') 
     content_data = form.cleaned_data.get("content") 
     parent_obj = None 
     try: 
      parent_id = int(request.POST.get("parent_id")) 
     except: 
      parent_id = None 

     if parent_id: 
      parent_qs = Comment.objects.filter(id=parent_id) 
      if parent_qs.exists() and parent_qs.count() == 1: 
       parent_obj = parent_qs.first() 


     new_comment, created = Comment.objects.get_or_create(
          user = request.user, 
          content_type= content_type, 
          object_id = obj_id, 
          content = content_data, 
          parent = parent_obj, 
         ) 
     return HttpResponseRedirect(new_comment.content_object.get_absolute_url()) 


    comments = instance.comments 
    context = { 
     "title": instance.title, 
     "instance": instance, 
     "share_string": share_string, 
     "comments": comments, 
     "comment_form":form, 
    } 
    return render(request, "post_detail.html", context) 

def post_list(request): 
    today = timezone.now().date() 
    queryset_list = Post.objects.active() #.order_by("-timestamp") 
    if request.user.is_staff or request.user.is_superuser: 
     queryset_list = Post.objects.all() 

    query = request.GET.get("q") 
    if query: 
     queryset_list = queryset_list.filter(
       Q(title__icontains=query)| 
       Q(content__icontains=query)| 
       Q(user__first_name__icontains=query) | 
       Q(user__last_name__icontains=query) 
       ).distinct() 
    paginator = Paginator(queryset_list, 8) # Show 25 contacts per page 
    page_request_var = "page" 
    page = request.GET.get(page_request_var) 
    try: 
     queryset = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     queryset = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     queryset = paginator.page(paginator.num_pages) 


    context = { 
     "object_list": queryset, 
     "title": "List", 
     "page_request_var": page_request_var, 
     "today": today, 
    } 
    return render(request, "post_list.html", context) 





def post_update(request, slug=None): 
    if not request.user.is_staff or not request.user.is_superuser: 
     raise Http404 
    instance = get_object_or_404(Post, slug=slug) 
    form = PostForm(request.POST or None, request.FILES or None, instance=instance) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     messages.success(request, "<a href='#'>Item</a> Saved", extra_tags='html_safe') 
     return HttpResponseRedirect(instance.get_absolute_url()) 

    context = { 
     "title": instance.title, 
     "instance": instance, 
     "form":form, 
    } 
    return render(request, "post_form.html", context) 



def post_delete(request, slug=None): 
    if not request.user.is_staff or not request.user.is_superuser: 
     raise Http404 
    instance = get_object_or_404(Post, slug=slug) 
    instance.delete() 
    messages.success(request, "Successfully deleted") 
    return redirect("posts:list") 
+0

Nie można odpowiedzieć. Co chcesz zrobić z tym polem? Jakich wyników oczekujecie? Jak wygląda reszta twojego widoku? –

+0

@DanielRoseman To jest reszta aplikacji- https://github.com/codingforentrepreneurs/Advancing-the-Blog/tree/master/src/posts. Dodałem nowe pole "userc" do forms.py, które pozwala wybrać użytkownika. Chcę, aby ten wybrany użytkownik był wyświetlany w szablonie. – uitwaa

+0

To wciąż nie jest wystarczająco dużo szczegółów. * Który * widok? A co ważniejsze, co wypróbowałeś w swoich "różnych metodach" i co się stało? –

Odpowiedz

4

Kod do tej pory w forms.py i views.py jest dobry. Jednak aby wyświetlić userc w szablonach post_detail.html i post_list.html, należy zapisać pole do bazy danych po przesłaniu formularza.

Jednym ze sposobów, aby to zrobić jest dodać pole userc do Post modelu

  1. Dodaj userc = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userc', default=1) do klasy Post w posts/models.py
  2. Run python manage.py makemigrations posts a następnie python manage.py migrate w wierszu poleceń (upewniając się, że” najpierw w katalogu src)

Teraz w szablonie post_detail.html można dodać {{ instance.userc }}, aby wyświetlić wybranego użytkownika.

uwaga: related_name='userc' jest wymagany jako Post ma już obcy klucz do modelu użytkownika.

0

Przepuścić przykład jako zmiennej kontekstu.

context = { "form": form, "instance": instance }

Ustaw instance = None wcześniej, aby to działało jeśli request.method nie jest post. Szablony mogą uzyskiwać dostęp tylko do zmiennych przekazywanych jako kontekst w widoku. Tak więc przekazanie instancji w kontekście pozwoli ci użyć {{instance.userc}}.

CodingforEntrepenuers to doskonały samouczek, ale zaleca się dokładniejsze obserwowanie i poprawianie podstaw.

Powiązane problemy