Ну, у меня проблема с кнопкой публикации на моем сайте django.Она не выполняет свою функцию

#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. Да, конечно, но я не понимаю следующую часть вашего кода