Reputation: 391
I have a project called Star Social this project you can only post if you are in group in this case i can still post even if i am not in a group and i can still see that post in the group that i selected. What i want is when user tried to post even out of the group they will receive an error and redirect them to group page so that they can join a group and they can now post.I tried to search on google but i get no result and btw i am new in this field and i am currently learning django.
models.py
##########################
## POSTS MODELS.PY FILE ##
##########################
from django.contrib.auth import get_user_model
from django.db import models
from groups.models import Group
from misaka import html
from django.urls import reverse
User = get_user_model()
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now=True)
message = models.TextField()
message_html = models.TextField(editable=False)
group = models.ForeignKey(Group, related_name='posts', null=True, blank=True, on_delete=models.CASCADE)
def __str__(self):
return self.message
def save(self, *args, **kwargs):
self.message_html = html(self.message)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse(
'posts:single',
kwargs={
'username': self.user.username,
'pk': self.pk
}
)
class Meta:
ordering = ['-created_at']
views.py
#########################
## POSTS VIEWS.PY FILE ##
#########################
from braces.views import SelectRelatedMixin
from django.contrib.auth import get_user_model
from django.views import generic
from posts.models import Post
from django.http import Http404
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.contrib import messages
from django.shortcuts import get_object_or_404
from groups.models import Group, GroupMember
User = get_user_model()
class PostList(SelectRelatedMixin, generic.ListView):
model = Post
select_related = ('user', 'group')
class UserPost(generic.ListView):
model = Post
template_name = 'posts/user_post_list.html'
def get_queryset(self):
try:
self.post_user = User.objects.prefetch_related('posts').get(
username__iexact=self.kwargs.get('username')
)
except User.DoesNotExist:
raise Http404
else:
return self.post_user.posts.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['post_user'] = self.post_user
return context
class PostDetail(SelectRelatedMixin, generic.DetailView):
model = Post
select_related = ('user', 'group')
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(
user__username__iexact=self.kwargs.get('username')
)
class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
model = Post
fields = ('message', 'group')
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return super().form_valid(form)
class DeletePost(LoginRequiredMixin, SelectRelatedMixin, generic.DeleteView):
model = Post
select_related = ('user', 'group')
success_url = reverse_lazy('posts:all')
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(user_id=self.request.user.id)
def delete(self, *args, **kwargs):
messages.success(self.request, ('Post Delete'))
return super().delete(*args, **kwargs)
Upvotes: 1
Views: 2464
Reputation: 63
Create a helper function that can help you check the user group.
def has_group(user, group):
return user.groups.filter(name=group).exists()
Or
def has_groups(user, group):
return user.groups.filter(name__in=group).exists()
Return true or false and then handle your request from there.
Example:
class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
model = Post
fields = ('message', 'group')
def form_valid(self, form):
if has_group(self.request.user, "HelloDjango"): # Or has_groups(self.request.user, ["HelloDjango", "TEST"])
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return super().form_valid(form)
else:
messages.error(self.request, "Not authorized to post in this group",) # Django messages
return super().form_invalid(form) # Or redirect to group page
Upvotes: 2