#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 для моего отредактированного вопроса