Контекст не печатает Django - PullRequest
1 голос
/ 14 марта 2019

Я знаю, что моя проблема может быть в недостатке знаний Django, но я пытаюсь передать пользовательский ввод из одной формы в представление, в другое представление, которое затем отобразит HTML-страницу этого представления с заданным вводом.

Я перенаправлен нормально, но данные не отображаются. Я считаю, что это как-то связано с тем, что контексты не передаются должным образом, но я не понимаю, что не так или как это исправить.

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 %}

А 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 %}

редактирование:

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 %}

А 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')),
]

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

В вашем коде есть несколько проблем. Давайте исправим их один за другим (пожалуйста, проверьте комментарии кода для объяснения):

В home_view вы делаете несколько избыточных кодов, вы можете упростить это так:

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

Теперь давайте обновим подробный вид, чтобы поймать перенаправление :

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 %}

Здесь get_object_or_404 получает запись для модели Post, если она не найдена, выдает ошибку 404.

2 голосов
/ 14 марта 2019

Контексты по запросу. Как только ваше представление вернулось, контекст больше не существует. Когда вы делаете перенаправление, вы завершаете этот цикл запроса / ответа и запускаете другой с вашим представлением detail. Ни один из контекста не будет перенесен.

Вместо этого вам нужен способ хранения соответствующей информации между запросами. Один довольно простой способ сделать это - сохранить данные в сеансе .

Например, вы можете хранить title в сеансе, подобном этому, в home_view:

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

А затем в вашем представлении detail_view вы можете добавить его в свой контекст:

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

Дополнительную информацию смотрите в документации по сессиям Django: https://docs.djangoproject.com/en/2.1/topics/http/sessions/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...