Как печатать записи из базы данных в Django?

#python #django

#python #django

Вопрос:

У меня есть несколько отдельных записей, сохраненных в базе данных (они называются «Вставки»). Для каждой из этих записей у меня есть случайно сгенерированная строка, которая сохраняется в поле с именем generated_url , которое я затем могу ввести в адресную строку, чтобы получить доступ к деталям, привязанным к этой конкретной записи. Перейдем к projectname.com/jF7Fwr напечатает все детали, привязанные к записи, которая имеет jF7Fwr значение generated_url .

Моя проблема в том, что, хотя он корректно перенаправляет на страницу, я не печатаю ни одной детали, и я не уверен, почему.

Вот соответствующая часть моего 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,)))
    else:
        form2 = PostForm()

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

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

И вот моя details.html страница:

 {% extends "base.html" %}
{% block content %}
<p>Content of post:</p>
I AM REDIRECTED

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

<p>Content of post:</p>

<p>{{post.content|linebreaks}}</p>
<p>{{ poster_name }}
{{ paste_contents }}
{{ paste_title }}
{{ paste_syntax }}
{{ paste_visible }}</p>
<!--<form action="/{{post.generated_url}}/delete" method="post">
    {% csrf_token %}
    <input type="submit" name="delete" value="Delete" />
</form>-->
{% endblock %}
  

Редактировать:

Должен ли мой detail_view быть чем-то вроде этого?

 def detail_view(request, *args, **kwargs):
    form2 = PostForm(request.POST)
    post = form2.save(commit=False)
    post.poster = request.user
    post.content = form2.cleaned_data.get('content')
    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
    post.save()
    context = {
        "poster_name": post.poster,
        "paste_contents": post.content,
        "paste_title": post.title,
        "paste_syntax": post.syntax,
        "paste_visible": post.public
    }
    return render(request, "paste_detail.html", context)
  

Я просто немного запутался в том, как область видимости переменных должна переноситься из каждой def .

Комментарии:

1. Где ваш просмотр сведений?

2. @KlausD. Я отредактировал свой пост. Я полагаю, что моя проблема заключается в этом представлении, но я не уверен, где

3. О области видимости: она не передается между представлениями, поскольку они представляют собой разные HTTP-запросы. Чтобы перенести информацию из одного представления в другое, вы должны использовать форму, строку запроса в URL или другую информацию, встроенную в URL. Это, кстати, также учитывается для URL-адреса местоположения перенаправления. Также существуют сеансы и файлы cookie, но это может быть чем-то, что нужно изучить позже.

Ответ №1:

Ваш detail_view использует пустой контекст ( {} ), в то время как context переменная в home_view не используется. Заполните контекст в представлении сведений, как в домашнем представлении, и это сработает. Для этого вам нужно будет извлечь post из базы данных.

Помните, что перенаправление заставляет клиента выполнять новый запрос, и контекст теряется между запросами.

Комментарии:

1. Я думал сделать это, но если бы я заполнил контекст для, detail_view как я сделал в home_view , разве это не сработало бы из-за того, что post находится в рамках home_view ? Я понимаю вашу логику, это просто фактическая реализация, которая ускользает от моего мозга.

2. Как отредактировано выше, вам придется снова извлекать объект из базы данных.

3. Возможно, это просто мой мозг устал, но я не уверен, как поступить с тем, что вы говорите. Пожалуйста, проверьте OP для моего отредактированного вопроса