2017-07-09 28 views
5

Tôi đang cố gắng để thay đổi bài viết ứng dụng từ một django tutorial- https://github.com/codingforentrepreneurs/Advancing-the-Blog/tree/master/src/postsFetch dữ liệu từ dạng và hiển thị trong mẫu

tôi là tạo ra một lĩnh vực mới 'userc' trong một forms.py:

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

Tôi đã thử các phương pháp khác nhau nhưng tôi không thể hiển thị người dùng được chọn trong mẫu.

Tôi nên thêm gì trong views.py?

Chỉnh sửa: Tôi đã thử {{obj.userc}}, {{instance.userc}} để hiển thị người dùng được chọn trong các mẫu.

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

Điều này là không thể trả lời. Bạn muốn làm gì với trường đó? Những gì bạn mong đợi đầu ra? Phần còn lại của bạn trông như thế nào? –

+0

@DanielRoseman Đây là phần còn lại của ứng dụng- https://github.com/codingforentrepreneurs/Advancing-the-Blog/tree/master/src/posts. Tôi đã thêm một trường mới 'userc' vào forms.py cho phép bạn chọn một người dùng. Tôi muốn người dùng được chọn này được hiển thị trong mẫu. – uitwaa

+0

Điều đó vẫn chưa đủ chi tiết. * Chế độ xem nào? Và quan trọng hơn, bạn đã thử gì trong "các phương pháp khác nhau" và điều gì đã xảy ra? –

Trả lời

4

Mã bạn có cho đến nay trong forms.pyviews.py là tốt. Tuy nhiên, để hiển thị userc trong các mẫu post_detail.htmlpost_list.html, bạn sẽ cần phải lưu trường vào cơ sở dữ liệu khi biểu mẫu được gửi.

Một cách để làm điều này là thêm một lĩnh vực userc đến Post mô hình:

  1. Thêm userc = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userc', default=1) đến lớp Post trong posts/models.py
  2. Run python manage.py makemigrations posts và sau đó python manage.py migrate trên dòng lệnh (đảm bảo bạn' vào thư mục src trước)

Bây giờ, trong mẫu post_detail.html, bạn có thể thêm {{ instance.userc }} để hiển thị người dùng đã chọn.

lưu ý: related_name='userc' là bắt buộc vì Post đã có khóa ngoại cho mô hình người dùng.

0

Vượt qua dụ như là một biến ngữ cảnh.

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

Đặt instance = None trước để làm cho nó làm việc nếu request.method không POST. Các mẫu có thể truy cập chỉ các biến được chuyển thành ngữ cảnh trong khung nhìn. Vì vậy, việc chuyển trường hợp trong ngữ cảnh sẽ cho phép bạn sử dụng {{instance.userc}}.

CodingforEntrepenuers là một hướng dẫn tuyệt vời, nhưng tôi khuyên bạn nên theo dõi kỹ hơn và lấy nguyên tắc cơ bản của bạn.

Các vấn đề liên quan