Можно ли не перезагружать страницу после добавления комментария(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 %}
Каким образом можно сделать так,чтобы после добавления комментария страница не перезагружалась, а комментарий добавлялся(+ не сбивался плеер)? И как можно добавить чат на сайт? Спасибо за помощь)))