Daten aus Form und Anzeige in Vorlage abrufen

Ich versuche, Beiträge App aus einem Django Tutorial zu ändern – https://github.com/codingforentrepreneurs/Advancing-die-Blog/tree/master/src/posts

Ich schaffe ein neues Feld 'userc' in a forms.py:

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

Ich habe verschiedene Methoden ausprobiert, aber ich kann den ausgewählten Benutzer nicht in der Vorlage anzeigen.

Was soll ich in views.py hinzufügen?

Bearbeiten: Ich habe versucht {{obj.userc}}, {{instance.userc}}, um den ausgewählten Benutzer in Vorlagen anzuzeigen.

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

2 Solutions collect form web for “Daten aus Form und Anzeige in Vorlage abrufen”

Der Code, den du bisher in forms.py und views.py ist gut. Um jedoch userc in den Vorlagen post_detail.html und post_list.html , müssen Sie das Feld in die Datenbank speichern, wenn das Formular post_list.html wird.

Eine Möglichkeit, dies zu tun, fügt dem Post Modell ein userc Feld hinzu:

  1. Add userc = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='userc', default=1) zur Post Klasse in posts/models.py
  2. Führen Sie python manage.py makemigrations posts und dann python manage.py migrate auf der Kommandozeile (stellen Sie sicher, dass Sie in der src Verzeichnis zuerst)

Nun können Sie in der Vorlage post_detail.html {{ instance.userc }} hinzufügen, um den ausgewählten Benutzer anzuzeigen.

Note : related_name='userc' ist erforderlich, da Post bereits einen Fremdschlüssel für das Benutzermodell hat.

Übergeben Sie die Instanz als Kontextvariable.

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

Setzen Sie instance = None vorher, um es zu funktionieren, wenn request.method nicht POST ist. Vorlagen können nur auf die Variablen zugreifen, die als Kontext in der Ansicht übergeben werden. So übergeben Instanz in den Kontext wird Sie verwenden {{instance.userc}} .

CodingforEntrepenuers ist ein ausgezeichnetes Tutorial, aber ich würde empfehlen, näher zu folgen und Ihre Grundlagen richtig zu bekommen.

  • Wie man <div> tag anstelle von <li> hinzufügt
  • Bearbeiten des Modells ForeignKey als Inline in der Django-Administration?
  • So erstellen Sie Password Field im Modell django
  • Django-allauth set username das selbe wie email
  • Wie man Berechtigungen in Django zu Modellen hinzufügen und es mit der Shell testen
  • Ändern Sie das klickbare Feld in Django admin list_display
  • Python ist die beste Programmiersprache der Welt.