Je suis conscient que mon problème est peut-être dû au manque de connaissances de Django, mais j'essaie de transmettre l'entrée utilisateur d'un formulaire dans une vue, à une autre vue qui rendra ensuite la page HTML de cette vue avec l'entrée donnée.

Je suis bien redirigé, mais les données ne sont pas affichées. Je crois que cela a quelque chose à voir avec les contextes qui ne sont pas transmis correctement, mais je ne comprends pas ce qui ne va pas ou comment y remédier.

views.py

def home_view(request, *args, **kwargs):
    print(args, kwargs)
    print(request.user)
    if request.method == 'POST':
        form2 = PostForm(request.POST)
        if form2.is_valid():
            post = form2.save(commit=False)
            post.poster = request.user
            post.content = form2.cleaned_data.get('content')
            post.title = form2.cleaned_data.get('title')
            post.syntax = form2.cleaned_data.get('syntax')
            post.public = form2.cleaned_data.get('public')
            rand = str(uuid.uuid4())[:6]
            while Paste.objects.filter(generated_url=rand):
                rand = str(uuid.uuid4())[:6]
            post.generated_url = rand
            form2.save()
            context = {
                "poster_name": post.poster,
                "paste_contents": post.content,
                "paste_title": post.title,
                "paste_syntax": post.syntax,
                "paste_visible": post.public
            }
            return HttpResponseRedirect(reverse('details', args=(post.generated_url,)), context)
    else:
        form2 = PostForm()

    return render(request, "home.html", {'form2': form2})
def detail_view(request, *args, **kwargs):

    if request.user.is_authenticated:
        if request.method=='POST':
            form3 = PostForm(request.POST)
            url = form3.generated_url
            your_posts = Paste.objects.get(url)
            context = {
                'form3': form3
            }
            return render(request, "paste_detail.html", context)

    return render(request, "paste_detail.html", {'form3': form3})

home.html

{% extends "base.html" %}

{% block content %}
<h1>Your user is {{ request.user }}</h1>
<div class="submit_form">
<form action="" method="POST">
  {% csrf_token %}
  {{ form2.as_p }}<br>
  <input type="submit" name="submit" value="Paste" id="submit">
</div>

{% endblock content %}

Et paste_detail.html

{% extends "base.html" %}
{% block content %}
<!--<h1>Name of post: {{ post.title }}</h1>-->

<p>Content of post:</p>
I AM REDIRECTED
<h1>Name of post: {{ form2.title }}</h1>

<p>Content of post:</p>

<p>{{form3.content|linebreaks}}</p>
{{ form3.poster }}
{{ form3.contents }}
{{ form3.title }}
{{ form3.syntax }}
{{ form3.visible }}
{% endblock %}

Éditer:

views.py

def home_view(request, *args, **kwargs):

    if request.method == 'POST':
        form2 = PostForm(request.POST)
        if form2.is_valid():
            post = form2.save(commit=False)
            post.poster = request.user
            post.save()
            rand = str(uuid.uuid4())[:6]
            while Paste.objects.filter(generated_url=rand):
                rand = str(uuid.uuid4())[:6]
            post.generated_url = rand
        #    return HttpResponseRedirect(reverse('details', args=(post.generated_url,)), context)
            return redirect('detail', rand)
    else:
        form2 = PostForm()

    return render(request, "home.html", {'form2': form2})
def detail_view(request, custom_uuid):

    post = get_object_or_404(Paste, pk=pk)
    return render(request, "paste_detail.html", {'post': post})
    #return render(request, "paste_detail.html", {'form3': form3})

paste_detail.html

{% extends "base.html" %}
{% block content %}


<p>Content of post:</p>
I AM REDIRECTED

<h1>Name of post: {{ post.title }}</h1>



<p>Creator of post:</p> {{ post.poster }}
<p>Content of post:</p> {{ post.content }}
<p>Title of post:</p> {{ post.title }}
{{ post.syntax }}
{{ post.visible }}
{% endblock %}

Et urls.py

...
urlpatterns = [
    path('home/', home_view, name='home'),
    path('contact/', contact_view, name='contact'),
    path('admin/', admin.site.urls, name='admin'),
    path('about/', about_view, name='about'),
    url(r'^signup/$', views.signup, name='signup'),
    path('paste_list/', paste_list_view, name='paste_list'),
    url(r'^$', home_view),
    #url(r'^(?P<rand_url>\S{6})/$', detail_view, name='details'),
    path('detail/<str:custom_uuid>/', detail_view, name='detail'),
    path('accounts/', include('django.contrib.auth.urls')),
]
1
sudo-potato 14 mars 2019 à 21:24

2 réponses

Meilleure réponse

Il y a plusieurs problèmes dans ton code. Réparons-les un par un (veuillez vérifier les commentaires du code pour plus d'explications) :

Dans home_view, vous faites des codes redondants, vous pouvez simplifier comme ceci :

from django.shortcuts import redirect

...
if request.method == 'POST':
    form2 = PostForm(request.POST)
    if form2.is_valid():
        post = form2.save(commit=False)  # it is not saved in db
        post.poster = request.user
        rand = str(uuid.uuid4())[:6]
        while Paste.objects.filter(generated_url=rand).exists():
            rand = str(uuid.uuid4())[:6]
        post.generated_url = rand
        post.save()  # it will save all information to DB, so you don't need to call form2.cleaned_data.get(..)

       return redirect('details', custom_uuid=rand)  # I am redirecting to `detail_view`. here `rand` is the random uuid of the post which is saved in db
else:
    form2 = PostForm()

return render(request, "home.html", {'form2': form2})  # rendering form for GET request

Mettons maintenant à jour la vue détaillée pour attraper la redirection :

from django.shortcuts import get_object_or_404

def detail_view(request, custom_uuid):
    post = get_object_or_404(Post, generated_url=custom_uuid)  # getting the post object from database using model. 
    return render(request, "post_detail.html", {'post': post})  # sending data in context to template

# url
path('detail/<str:custom_uuid>/', detail_view, name='detail')  # here <str:custom_uuid> will catch the uuid sent in the url

# HTML
{% extends "base.html" %}
{% block content %}

<p>Content of post:</p>
I AM REDIRECTED
<h1>Name of post: {{ post.title }}</h1>  // <-- getting this context from view

<p>Content of post:</p>

<p>{{post.content|linebreaks}}</p>
{{ post.poster }}
{{ post.contents }}
{{ post.title }}
{{ post.syntax }}
{{ post.visible }}
{% endblock %}

Ici, get_object_or_404 obtient l'entrée pour le modèle Post, s'il n'est pas trouvé, l'erreur 404 est générée.

2
ruddra 14 mars 2019 à 19:21

Les contextes sont par demande. Une fois que votre vue est revenue, le contexte n'existe plus. Lorsque vous effectuez une redirection, vous terminez ce cycle de demande / réponse et en commencez un autre avec votre vue detail. Aucun contexte ne se perpétuera.

Au lieu de cela, vous avez besoin d'un moyen de stocker des informations pertinentes entre les demandes. Un moyen assez simple de le faire consiste à stocker des données dans la session .

Par exemple, vous pouvez stocker title dans une session comme celle-ci dans home_view:

request.session['title'] = post.title

Et puis dans votre vue detail_view, vous pouvez l'ajouter à votre contexte:

context = {
    'title': request.session.get('title')
}

Consultez la documentation Django sur les sessions pour plus d'informations : https://docs. djangoproject.com/en/2.1/topics/http/sessions/

2
Nikolas Stevenson-Molnar 14 mars 2019 à 18:56