Можно ли не перезагружать страницу после добавления комментария(Django)?

models.py

from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse


class anime(models.Model): 
    anime_url = models.SlugField(null = True,max_length = 20,verbose_name = "URL")
    anime_photo = models.FileField(upload_to='media',verbose_name='Фото')
    anime_name = models.CharField(max_length = 50,verbose_name='Название Аниме') 
    anime_raiting =  models.CharField(null=True,max_length = 5,verbose_name='Рейтинг') 
    def __str__(self):
        return self.anime_name

    class Meta:
        verbose_name_plural = 'Все аниме'
        verbose_name = 'Аниме'


class AnimeSeasons(models.Model): 
    anime = models.ForeignKey(anime,on_delete=models.CASCADE,verbose_name = 'Название Аниме',blank = True,null = True,related_name='seasons')
    slug = models.SlugField(null = True,max_length = 20,verbose_name = "URL")
    season_num =  models.CharField(null = True,max_length = 3,verbose_name='Номер сезона')
    season_photo = models.FileField(upload_to='media',verbose_name='Фото',blank = True,null = True)
    season_raiting =  models.CharField(null=True,max_length = 5,verbose_name='Рейтинг') 
    description = models.TextField(null = True,blank = True,verbose_name='Описание')
    class Meta: 
        verbose_name_plural = 'Все сезоны'
        verbose_name = 'Сезон' 

    def __str__(self):
        return f'{self.slug} - {self.season_num}'


    def get_absolute_url(self):
        return ('animeseasons:detail', (), {
            'slug': self.anime.anime_url,
            'season_num': self.season_num,
        })

class AnimeSeries(models.Model): 
    anime_season =  models.ForeignKey(AnimeSeasons,on_delete=models.CASCADE,verbose_name = 'Сезон Аниме',blank = True,null = True)
    series_num = models.CharField(null = True,max_length = 50,verbose_name='Номер Серии')
    link = models.CharField(max_length = 50,verbose_name='Ссылка на плеер') 
    class Meta: 
        verbose_name_plural = 'Все серии сезона'
        verbose_name = 'Серия' 
    def __str__(self):
        return self.series_num



class Comments(models.Model): 
    anime_season = models.ForeignKey(AnimeSeasons,on_delete=models.CASCADE,verbose_name = 'Сезон',blank = True,null = True)
    author = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name = 'Автор комментария',blank = True,null = True)
    date = models.DateTimeField(auto_now=True,verbose_name='Дата написания')
    text = models.TextField(verbose_name='Текст Комментария')
    class Meta: 
        verbose_name_plural = 'Все комментарии'
        verbose_name = 'Комментарий' 
    def __str__(self):
        return self.text


class Chat(models.Model): 
    User = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name = 'Автор сообщения',blank = True,null = True)
    date = models.DateTimeField(auto_now=True,verbose_name='Дата написания',null = True) 
    text = models.TextField(verbose_name='Текст Комментария',null = True) 
    parent = models.ForeignKey('self',verbose_name='Ответ',null = True,on_delete=models.CASCADE)
    class Meta: 
        verbose_name_plural = 'Все сообщения'
        verbose_name = 'Сообщение'  
    def __str__(self):
        return self.text

views.py

from django.views.generic import ListView,CreateView,DetailView,View
from django.views.generic.edit import FormMixin
from django.shortcuts import render,get_object_or_404
from .models import anime,AnimeSeasons,AnimeSeries,Comments,Chat
from django.contrib.auth.views import LogoutView,LoginView
from django.urls import reverse_lazy
from .forms import AuthUser,RegisterForm
from django.contrib.auth.models import User 
from django.contrib.auth import authenticate,login 
from .forms import UserCommentsForm,UserChatForm


#работает
class StartpageCreateView(ListView):
    model = anime 
    template_name = 'sitepage/sitepage.html' 
    context_object_name = 'all_anime'

#работает
class LogoutUser(LogoutView): 
    next_page = reverse_lazy('sitepage')  

#работает
class AuthUserClass(LoginView): 
    template_name = 'sitepage/auth.html' 
    form_class = AuthUser 
    success_url = reverse_lazy('sitepage')   
    def get_success_url(self): 
         return self.success_url
#работает
class RegisterUserClass(CreateView):
    model = User 
    template_name = 'sitepage/register.html' 
    form_class = RegisterForm 
    success_url = reverse_lazy('sitepage') 
    def form_valid(self,form): 
        form_valid = super().form_valid(form) 
        username = form.cleaned_data['username'] 
        password = form.cleaned_data['password'] 
        auth_user = authenticate(username = username,password = password) 
        login(self.request,auth_user) 
        return form_valid 

#работает
def SeasonsViewFunck(request,slug): 
    template = 'sitepage/season.html' 
    season_inf = AnimeSeasons.objects.filter(slug=slug)
    context = {'season_inf':season_inf}
    return render(request, template, context)


#работает
class SeriesViewClass(FormMixin,DetailView): 
    model = AnimeSeasons 
    form_class = UserCommentsForm 
    template_name = 'sitepage/series.html'

    def get_success_url(self,**kwargs): 
        return reverse_lazy('SeriesPage',kwargs = {'slug':self.get_object().slug,'season_num':self.get_object().season_num})

    def get_queryset(self):
        return AnimeSeasons.objects.filter(slug=self.kwargs['slug']).filter(season_num = self.kwargs['season_num'])

    def get_context_data(self,**kwargs): 
        context = super(SeriesViewClass, self).get_context_data(**kwargs)
        context['season'] = AnimeSeasons.objects.filter(pk = self.get_object().pk)    
        context['series'] = AnimeSeries.objects.filter(anime_season_id = self.get_object().id)
        context['first'] = AnimeSeries.objects.filter(anime_season_id = self.get_object().id).filter(series_num = 1)
        context['comments'] = Comments.objects.filter(anime_season_id = self.get_object().id)
        return context

    def post(self,request,*args,**kwargs): 
        form = self.get_form() 
        if form.is_valid(): 
            return self.form_valid(form) 
        else: 
            return self.form_invalid(form)

    def form_valid(self,form):
        self.object = form.save(commit = True) 
        self.object.anime_season_id = self.get_object().id
        self.object.author = self.request.user 
        self.object.save() 
        return super().form_valid(form)

    def form_invalid(self,form): 
        pass 

class ChatViewClass(CreateView): 
    template_name = 'sitepage/chat.html' 
    model = Chat
    form_class = UserChatForm

forms.py

from django import forms 
from django.forms import Textarea
from .models import Comments,Chat
from django.contrib.auth.forms import AuthenticationForm 
from django.contrib.auth.models import User 


class UserCommentsForm(forms.ModelForm): 
    class Meta: 
        model = Comments 
        fields = ('text',)    

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for field in self.fields: 
            self.fields[field].widget.attrs['class'] = 'form-control' 
        self.fields['text'].widget = Textarea(attrs={'rows':1})  

class AuthUser(AuthenticationForm,forms.ModelForm): 
    class Meta: 
        model = User 
        fields = ('username','password')

class RegisterForm(forms.ModelForm): 
    class Meta: 
        model = User 
        fields = ('username','password') 

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for field in self.fields: 
            self.fields[field].widget.attrs['class'] = 'form-control' 

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password"])
        if commit:
            user.save()
        return user 

class UserChatForm(forms.ModelForm): 
    class Meta: 
        model = Chat 
        fields = ('text',)    

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for field in self.fields: 
            self.fields[field].widget.attrs['class'] = 'form-control' 
        self.fields['text'].widget = Textarea(attrs={'rows':1})  

urls.py

from django.urls import path,include 
from .views import StartpageCreateView,LogoutUser,SeriesViewClass,AuthUserClass,RegisterUserClass,SeasonsViewFunck,SeriesViewClass,ChatViewClass

urlpatterns = [
    path('',StartpageCreateView.as_view(),name = 'sitepage'),
    path('logout/',LogoutUser.as_view(),name = 'logout'),
    path('auth/',AuthUserClass.as_view(),name = 'Auth'),
    path('register/',RegisterUserClass.as_view(),name = 'Register'),
    path('chat/',ChatViewClass.as_view(), name = 'Chat'),
    path('<slug:slug>/',SeasonsViewFunck,name='SeasonPage'),
    path('<slug:slug>/<int:season_num>',SeriesViewClass.as_view(),name='SeriesPage'),
]

series.html

{% extends 'sitepage/sitepage.html' %}
{% load static %} 
{% block title %}Серии{% endblock %}
{% block css %}{% static 'sitepage/sitepage.css' %}{% endblock %}
{% block content %}
{% for inf in season %}
<div id = 'inf' class="container">
{% if inf.season_photo%}
    <form enctype="multipart/form-data"> 
        <h3 id = 'information'><img src="{{inf.season_photo.url}}" width="400" height="500" alt="Изображение" id = 'proxy-img'>{{inf.description}}</h3>
    </form>  
{% endif %}
</div> 
{% endfor %}
 <div id = 'series'>       
        <div id="change">         
            <div id = 'cool' class="btn-group" role="group" aria-label="Basic example"> 
            {% for series in series %}          
                <button id = "but{{series.series_num}}" type="button" class="btn btn-secondary">{{series.series_num}}</button>
                    <script>
                        but{{series.series_num}}.onclick = function(){
                            var video = '{{series.link}}';
                            var play = document.getElementById("pleer");
                            pleer.src = video;
                            but1.style.BackgroundColor = "#FFFFFF";
                            }
                    </script>     
            {% endfor %}               
            </div>

        </div>

        <div id = "video">
        {% for first in first %}
            <iframe id = "pleer" width = '1000' height="384" src="{{first.link}}" frameborder="0" scrolling="no" allowfullscreen></iframe>
        {% endfor %}
        </div>
    </div> 
<div>


<div id = 'comment'> 
    {% for comment in comments %}
    <p>{{comment.author}}({{comment.date}})</p> 
    <p>{{comment.text}}</p> 
    {% endfor %}
</div>

{% if request.user.is_authenticated%}
<div> 
    <form id = 'add-comment' method = 'POST'> 
    {% csrf_token %}
        {{form}} 
        <button form='add-comment' type='submit' class = 'btn.btn-primary.mt-4'>Добавить комментарий</button>
    </form>
</div>
{% else %} 
<div> 
<p>Только авторизированные пользователи могут оставлять комментарии</p>
</div> 
{% endif %}
</div>
{% endblock %}

Каким образом можно сделать так,чтобы после добавления комментария страница не перезагружалась, а комментарий добавлялся(+ не сбивался плеер)? И как можно добавить чат на сайт? Спасибо за помощь)))


Ответы (0 шт):