【问题标题】:Fetch data from form and display in template从表单中获取数据并在模板中显示
【发布时间】:2017-12-13 13:26:34
【问题描述】:

我正在尝试从 django 教程中修改帖子应用程序-https://github.com/codingforentrepreneurs/Advancing-the-Blog/tree/master/src/posts

我正在 forms.py 中创建一个新字段“userc”:

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

我尝试了各种方法,但无法在模板中显示所选用户。

我应该在views.py中添加什么?

编辑: 我试过 {{ obj.userc }}, {{ instance.userc }} 在模板中显示选定的用户。

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")

【问题讨论】:

  • 这是无法回答的。你想用那个领域做什么?你期待什么输出?你的视图的其余部分是什么样的?
  • @DanielRoseman 这是应用程序的其余部分-github.com/codingforentrepreneurs/Advancing-the-Blog/tree/…。我在 forms.py 中添加了一个新字段“userc”,它允许您选择一个用户。我希望这个选定的用户显示在模板中。
  • 这还不够详细。 哪个视图?更重要的是,您在“各种方法”中尝试了什么?发生了什么?
  • 我不明白为什么您要显示实际视图如此困难。如果没有看到该视图以便我们可以看到您实际在做什么以及正在将哪些对象发送到上下文,就无法提供帮助。
  • @DanielRoseman 更新!

标签: python django django-models django-forms django-views


【解决方案1】:

到目前为止,您在 forms.pyviews.py 中的代码很好。但是,要在post_detail.htmlpost_list.html 模板中显示userc,您需要在提交表单时将该字段保存到数据库中。

一种方法是在Post 模型中添加一个userc 字段:

  1. userc = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userc', default=1) 添加到posts/models.py 中的Post
  2. 在命令行上运行python manage.py makemigrations posts,然后运行python manage.py migrate(确保您首先位于src 目录中)

现在,在post_detail.html 模板中,您可以添加{{ instance.userc }} 以显示所选用户。

注意related_name='userc' 是必需的,因为Post 已经有用户模型的外键。

【讨论】:

    【解决方案2】:

    将实例作为上下文变量传递。

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

    如果 request.method 不是 POST,则在之前设置 instance = None 以使其工作。模板只能访问在视图中作为上下文传递的变量。所以在上下文中传递实例会让你使用{{instance.userc}}

    CodingforEntrepenuers 是一个出色的教程,但我建议您更密切地学习并正确掌握基础知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      相关资源
      最近更新 更多