Retrieving data from a form and displaying in a template

I am trying to change posts application from django tutorial - https://github.com/codingforentrepreneurs/Advancing-the-Blog/tree/master/src/posts

I create a new 'userc' field in form.py:

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

I tried various methods, but I cannot display the selected user in the template.

What needs to be added to views.py?

Edit: I tried {{obj.userc}}, {{instance.userc}} to display the selected user in the templates.

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 (eg 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") 
+5
source share
2 answers

The code you still find in forms.py and views.py is good. However, to display userc in the post_detail.html and post_list.html you need to save the field in the database when submitting the form.

One way to do this is to add the userc field to the Post model:

  • Add userc = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userc', default=1) to the Post class in posts/models.py
  • Run python manage.py makemigrations posts and then python manage.py migrate on the command line (first make sure you are in the src directory)

Now in the post_detail.html template post_detail.html you can add {{ instance.userc }} to display the selected user.

note : related_name='userc' is required since Post already has a foreign key for the user model.

+4
source

Pass the instance as a context variable.

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

Set instance = None earlier to make it work if request.method not POST. Templates can only access variables that are passed as context in the view. Thus, passing an instance in context will allow you to use {{instance.userc}} .

CodingforEntrepenuers is a great tutorial, but I would recommend following it more carefully and correctly evaluate your basics.

0
source

Source: https://habr.com/ru/post/1269658/


All Articles