#python-3.x #django #django-models #django-rest-framework #django-views
#python-3.x #django #django-models #django-rest-framework #django-просмотры
Вопрос:
Я использую django 3.0.3, python 3.8.5 и Vs code в качестве IDE. Я нажимаю на кнопку публикации, но она не работает.
—Models.py—
def publish(self):
self.published_data = timezone.now()
self.save()
—views.py—
@login_required
def post_publish(request,pk):
post = get_object_or_404(Post,pk=pk)
post.publish()
return redirect('post_detail',pk=pk)
—urls.py—
path('post/<int:pk>/publish/',views.post_publish,name ='post_publish'),
—post_detail.html (шаблон)—
<a class="btn btn-primary" href="{% url 'post_publish' pk=post.pk %}">Publish</a>
—post_detail.html (Полный шаблон)—
{% extends "blog/base.html" %}
{% block content %}
<h1 class="posttitle loader">{{post.title}}</h1>
{% if post.published_date %}
<div class="date postdate">
{{ post.published_date}}
</div>
{% else %}
<a class="btn btn-primary" href="{% url 'post_publish' pk=post.pk %}">Publish</a>
{% endif %}
<p class="postcontent">{{ post.text|safe|linebreaksbr}}</p>
{% if user.is_authenticated %}
<a class= "btn btn-primary" href="{% url 'post_edit' pk=post.pk %}">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-pencil" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M11.293 1.293a1 1 0 0 1 1.414 0l2 2a1 1 0 0 1 0 1.414l-9 9a1 1 0 0 1-.39.242l-3 1a1 1 0 0 1-1.266-1.265l1-3a1 1 0 0 1 .242-.391l9-9zM12 2l2 2-9 9-3 1 1-3 9-9z"/>
<path fill-rule="evenodd" d="M12.146 6.354l-2.5-2.5.708-.708 2.5 2.5-.707.708zM3 10v.5a.5.5 0 0 0 .5.5H4v.5a.5.5 0 0 0 .5.5H5v.5a.5.5 0 0 0 .5.5H6v-1.5a.5.5 0 0 0-.5-.5H5v-.5a.5.5 0 0 0-.5-.5H3z"/>
</svg>
</a>
<a class= "btn btn-primary" href="{% url 'post_remove' pk=post.pk %}">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-trash" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z"/>
<path fill-rule="evenodd" d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4L4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z"/>
</svg>
</a>
{% endif %}
<hr>
<a class="btn btn-priamy btn-comment" href="{% url 'add_comment_to_post' pk=post.pk %}">Add Comment</a>
<div class="container">
{% for comment in post.comments.all %}
<br>
{% if user.is_authenticated or comment.apporved_comment %}
{{ comment.created_date }}
{% if not comment.approved_comment %}
<a class= "btn btn-primary" href="{% url 'comment_remove' pk=comment.pk %}">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-x" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M11.854 4.146a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708-.708l7-7a.5.5 0 0 1 .708 0z"/>
<path fill-rule="evenodd" d="M4.146 4.146a.5.5 0 0 0 0 .708l7 7a.5.5 0 0 0 .708-.708l-7-7a.5.5 0 0 0-.708 0z"/>
</svg>
</a>
<a class= "btn btn-primary" href="{% url 'comment_approve' pk=comment.pk %}">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-check2" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
</svg>
</a>
{% endif %}
<P> {{ comment.text|safe|linebreaks}}</p>
<P> Posted By:{{comment.author}}</p>
{% endif %}
{% empty %}
<p>No Comments</p>
{% endfor %}
</div>
{% endblock %}
Я новичок и изучаю фреймворк django, и мне так плохо, когда я зацикливаюсь на таких вещах, где я не мог понять, что делать, но я надеюсь, что вы, ребята, сможете мне помочь.
Любая помощь будет оценена
Спасибо
Ответ №1:
Я не думаю, что это сработало бы таким образом, я думаю, что что-то вроде этой работы сработало бы:
urls.py
path('post/publish',views.post_publish,name ='post_publish'),
forms.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = POST
fields = ['title', 'text', ...] # Your post model fields
views.py
from .forms import PostForm
@login_required
def post_publish(request):
if request.Method=='POST':
post_form = PostForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/post_detail/' str(pk))
post_form = PostForm()
return render(response, "publish.html", {"form": post_form})
шаблон publish.html (конечно, вы можете добавить другой HTML для представления, как вам нравится)
<form method="post">
{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Publish">
</form>
PostForm автоматически преобразует вашу модель Post в форму, когда вы «ПОЛУЧИТЕ» publish.html эта форма будет, и когда вы нажмете на кнопку публикации, она отправит данные формы по тому же URL-адресу, выполнив POST. в нашем представлении, когда это POST при разборе этого запроса в заполненную форму, мы вызываем is_valid для очистки данных и убедимся, что все проверки выполнены. Если это так, мы вызываем функцию сохранения, которая создаст сообщение и перенаправит на страницу сведений о публикации.
При реализации вы все еще можете столкнуться с некоторыми ошибками импорта или другими, но это должно дать вам представление о том, как это сделать. дайте мне знать, как вы это реализуете, и если вы столкнетесь с некоторыми ошибками.
Комментарии:
1. когда я нажимаю на кнопку публикации, она показывает только пустую страницу с тем же URL
2. и создан ли пост?
3. Ни одно сообщение не было создано или опубликовано
4. извините, я только что просмотрел код и обновил
def post_publish(request, pk):
доdef post_publish(request):
. Можете ли вы внести это изменение в свой код, снова запустить сервер и сообщить мне о результатах?5. Да, конечно, но я не понимаю следующую часть вашего кода