система комментирования переключается на ajax, поэтому не переходите на другую страницу - PullRequest
1 голос
/ 01 июня 2019

Мне удалось написать систему комментариев на python, django.но чтобы сделать комментарий, пользователь должен перейти на другой URL.Я не хочу, чтобы пользователи переходили на другую страницу, чтобы писать, редактировать, удалять комментарии.Я погуглил, и мне кажется, что я должен использовать ajax, но я не уверен.кто-нибудь может подсказать мне, как это сделать?

views.py

@login_required
def comment_new(request, post_pk):
    post = get_object_or_404(Post, pk=post_pk)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.author = request.user
            comment.save()
            return redirect('home')
    else:
        form = CommentForm()
    return render(request, 'community/comment_form.html', {
        'form':form,
        })

@login_required
def comment_edit(request, post_pk, pk):
    #post = get_object_or_404(Post, pk=post_pk)
    comment = get_object_or_404(Comment, pk=pk)
    if comment.author != request.user:
        return redirect(comment.post)
    if request.method == 'POST':
        form = CommentForm(request.POST, instance=comment)
        if form.is_valid():
            comment = form.save()
            return redirect(comment.post)
    else:
        form = CommentForm(instance=comment)
    return render(request, 'community/comment_form.html', {
        'form':form,
        })

@login_required
def comment_delete(request, post_pk, pk):
    comment = get_object_or_404(Comment, pk=pk)
    if comment.author != request.user:
        return redirect(comment.post)
    if request.method == 'POST':
        comment.delete()
        return redirect(comment.post)
    return render(request, 'community/comment_confirm_delete.html', {
        'comment':comment,
        })

models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,  on_delete=models.CASCADE)
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-id']

    def get_edit_url(self):
        return reverse('comment_edit', args=[self.post.pk, self.pk])

    def get_delete_url(self):
        return reverse('comment_delete', args=[self.post.pk, self.pk])

urls.py

urlpatterns = [
    path('', PostListView.as_view(), name='community-home'),
    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
    path('post/<int:post_pk>/comment/new',views.comment_new, name='comment_new'),
    path('post/<int:post_pk>/comment/<int:pk>/edit',views.comment_edit, name='comment_edit'),
    path('post/<int:post_pk>/comment/<int:pk>/delete',views.comment_delete, name='comment_delete'),

мой html

<a href="{% url 'comment_new' post.id %}">hello</a> 

  <ul>
    {% for comment in post.comment_set.all %}
    <li>
      {{comment.message}} by {{comment.author}} at {{comment.created_at}}
      {% if comment.author == request.user %}
      <a href="{{ comment.get_edit_url }} ">
        edit
      </a>
      <a href="{{comment.get_delete_url}}">delete</a>
      {% endif %}
    </li>
    {% endfor %}
  </ul>

forms.py

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['message']

1 Ответ

0 голосов
/ 01 июня 2019

Вы должны показать HTML. Я сделаю код Ajax для вас, если вы сделаете.

Сначала нужно убедиться, что в вашем скрипте есть jquery. Поместите это после головы и перед телом

  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

Затем вы должны вызвать функцию javascript через onclick для запроса AJAX.

   {% for comment in post.comment_set.all %}

      <a href=onclick="get_delete({{comment.id}})">delete</a>

    {% endfor %}

Вот функция javascript, которую вы вызываете:

function get_delete(n){

var patch = '{% url "comment_delete" %}'
var post_data = {
  'csrfmiddlewaretoken':"{{ csrf_token }}",
 'iddy':n,}

$.ajax({
  type: "POST",
  url: patch,
  data:post_data,
  datatype:'json',
success: function(data){
console.log(data)
return
}

})}

измените свой путь к URL.

path('post/commentdelete',views.comment_delete, name='comment_delete')

наконец, во взглядах

def comment_delete(request):
    if request.POST:
        response_json = request.POST
        response_json = json.dumps(response_json)
        data = json.loads(response_json)
        comment = get_object_or_404(Comment, id=data['iddy'])
        if comment.author != request.user:
            msg = "you didnt write this comment"
            data = {'msg':msg}
        else:
             comment.delete()
             msg = "deleted"
             data = {'msg':msg}
   return JsonResponse(data, safe=False) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...