How to arrange search results by the date they were created on? - python

I made a search bar but it gives the queries in an old to new order i want to change that to a new to old. I want to see the recent matches for my search first then the more old ones.
views.py
search_term=''
if 'search' in request.GET:
search_term_extract = request.GET['search']
search_term = Blog.objects.filter(Q(title__icontains=search_term_extract)|Q(author__username__icontains=search_term_extract))
paginator = Paginator(search_term, 8)
page = request.GET.get('page')
paginator_page = paginator.get_page(page)
results=search_term.all()['-date_posted']
message=True
nav=False
and models.py
class Blog(models.Model):
title=models.CharField(max_length=100)
content=models.TextField(blank=True)
date_posted=models.DateTimeField(default=timezone.now)
author=models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title

Use .order_by() on your queryset:
search_term = Blog.objects.filter(Q(title__icontains=search_term_extract)|
Q(author__username__icontains=search_term_extract)).order_by("-date_posted")

Related

Incorrect Context Appearing in Django Project

I am creating a workout project where for every workout there is a list of exercises and for every exercise there is a list of sets which has specific weights and reps.
Here is the model for more clarification:
class Workout(models.Model):
name = models.CharField(max_length = 30,blank=True, null=True)
date = models.DateField(blank=True, null=True)
def __str__(self):
return str(self.date) + ' ' + self.name
class Exercise(models.Model):
training = models.ForeignKey(Workout, on_delete=models.CASCADE, related_name='exercises',blank=True, null=True)
name = models.CharField(max_length = 30, blank=True, null=True)
def __str__(self):
return self.name
class Set(models.Model):
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, related_name='sets',blank=True, null=True)
weight = models.FloatField(validators=[MinValueValidator(0)],blank=True, null=True)
repetitions = models.IntegerField(validators=[MinValueValidator(1)],blank=True, null=True)
order = models.IntegerField(validators=[MinValueValidator(1)],blank=True, null=True)
def __str__(self):
return self.exercise.name + ' set #' + str(self.order)
I am trying to show the list of rep in each set for a specific excercise in the template page but I keep getting errors such as:
activity() missing 1 required positional argument: 'request'
or even nothing is showing at all. The most recent view I coded shows all the sets for all the excercises which is not the objective.
Here is the views:
def activity(self,request, **kwargs):
template_name = 'my_gym/start_workout.html'
excercises = Exercise.objects.all().order_by('id')
sets = Set.objects.filter(
set=self.object).order_by('id')
context = {
'excercises': excercises,
'sets': sets,
}
return render(request, template_name, context)
I also tried:
def activity(request):
template_name = 'my_gym/start_workout.html'
excercises = Exercise.objects.all().order_by('id')
sets = Set.objects.all().order_by('id')
context = {
'excercises': excercises,
'sets': sets,
}
return render(request, template_name, context)
Here is also another trial using filter:
def activity(request):
template_name = 'my_gym/start_workout.html'
excercises = Exercise.objects.all().order_by('id')
sets = Set.objects.filter(sets=set.excercises).order_by('id')
context = {
'excercises': excercises,
'sets': sets,
}
return render(request, template_name, context)
I got this error:
type object 'set' has no attribute 'excercises'
Here is the template:
{% for set in sets %}
<td>{{set.order}}</td>
<td>{{set.repetitions}}</td>
{% endfor %}
My question is how to show the sets only for the selected excercise.
A more info there is a previous page which shows all th excercises and when one specific exercise is selected I am expecting to see the reps related to this specific excercise only not the reps for all the exercises in the database.
Thank you
As I did in my project(it was blog):
In urls.py I created new page with category_id(=Category primary key) like this:
path('category/<int:category_id>/', get_category, name='category')
Now in get_category function I get additional parameter that meant the pk of the category to which it belongs. And in views.py:
def get_category(request, category_id):
records = Recordings.objects.filter(category=category_id)
category = Category.objects.get(pk=category_id)
context = {
'records': records,
'category': category,
'title': category.title,
}
return render(request=request, template_name='blog/category.html', context=context)
I just filtered them by category.pk and it worked fine
In your case Recording = Set, Category = Exercise, category_id = exercise_id
Or if you use another way of creating pages for exercised - pls comment, it will be interesting to find a solution for such a model
P.S. This is early version of my project, there should be used select_related for request optimizing
P.P.S Optimized version of view + urls
# urls.py
path('category/<int:category_id>/', RecordingsByCategory.as_view(), name='category')
# views.py
class RecordingsByCategory(ListView):
model = Recordings
template_name = 'blog/category.html'
context_object_name = 'records'
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = Category.objects.get(pk=self.kwargs['category_id'])
return context
def get_queryset(self):
# kwargs goes from urls.py
return Recordings.objects.select_related('category').filter(category=self.kwargs['category_id'], is_published=True)

Django Admin Panel can't access specific items

I've got a model of an article and everything works fine except when I change their status to draft - it disappears from Admin Django Panel. New articles are successfully added, but then don't show, the admin panel just can't access them. When I change the URL to force the admin panel to show me the details so I could edit it, I get a message that the article with the given ID doesn't exist. So basically every draft article gets lost. But I know they have to exist in my database because they show up on my article list view, but I can't go to detail view or draft view as I always get "No NewsModel matches the given query"
Django 2.0.5
models.py
class NewsModel(models.Model):
STATUS_CHOICES = (
('draft','Draft'),
('published','Published'),
)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
title = models.CharField(max_length=250)
slug = AutoSlugField(populate_from='title')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES)
image = models.ImageField(upload_to="news/")
description = models.TextField(null=True, blank=True)
def get_absolute_url(self):
from django.urls import reverse
return reverse('main:news_details', kwargs={'slug':self.slug})
def __str__(self):
return self.title
class Meta:
ordering = ('-publish',)
verbose_name = 'News'
verbose_name_plural = 'News'
admin.py
#admin.register(NewsModel)
class NewsAdmin(admin.ModelAdmin):
list_display = ('title', 'game', 'news_type', 'author', 'finish', 'publish')
views.py
def news_details(request, slug):
news = get_object_or_404(NewsModel, slug=slug)
news_aside = NewsModel.objects.filter(game=news.game).exclude(id=news.id)[:5]
return render(request, 'news/news_details.html', {'news':news, 'news_aside':news_aside, 'section':'news'})
def news(request):
""" List of all news """
news = NewsModel.objects.filter(status='published')[:3]
latest = news[0]
second = news[1]
third = news[2]
all_kind_news = NewsModel.objects.all()
return render(request, 'news/news.html', {'news':news, 'section':'news', 'all':all_kind_news, 'latest':latest, 'second':second, 'third':third, 'section':'news'})
def drafts(request):
""" List of all drafts """
news = NewsModel.objects.filter(status='draft')
paginator = Paginator(news, 9)
page = request.GET.get('page')
try:
news = paginator.page(page)
except PageNotAnInteger:
news = paginator.page(1)
except EmptyPage:
news = paginator.page(paginator.num_pages)
return render(request, 'news/news_list.html', {'news':news, 'section':'news', 'page':page})
urls.py (attaching just in case)
path('news/', views.news, name='news'),
path('news/<slug>', views.news_details, name='news_details'),
path('news/drafts', views.drafts, name='drafts'),
News_details, drafts, and admin panel throw 404 error while trying to access drafts, but the news list doesn't have that problem. The weirdest thing is that also admin panel is affected.

Like button back end logic using Django Rest Framework

I have a Blog app where users can add new Post and any users can like the post.
models.py
class Post(models.Model):
title = models.CharField(max_length=60)
class PostLikes(models.Model):
likeusers = models.ManyToManyField(User)
likepost = models.ForeignKey(Post,on_delete=models.CASCADE,null=True,related_name='likepost')
serializers.py
class PostSerializers(serializers.ModelSerializer):
#likepost = serializers.SerializerMethodField() **I have to mention like count here**
class Meta:
model = Post
fields = '__all__'
class PostlikeSerializer(serializers.ModelSerializer):
class Meta:
model = PostLikes
fields = '__all__'
views.py
class LikeListCreate(APIView):
def get(self,request,pk):#function to get total number of likes to particular post
post = Post.objects.filter(pk=pk) # find which post's likes are to be extracted
like_count = post.likepost.count()# counts total user likes ,besides my code is wrong
serializer = PostlikeSerializer(like_count,many=True)
return Response(serializer.data)
def post(self,request,pk):#function to add likes to post
# how do I check if user is already liked the post ?
likeusers = request.user
likepost = Post.objects.filter(pk=pk)
serializer = PostlikeSerializer(data=request.data)
if serializer.is_valid():
serializer.save(likeusers,likepost)
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
urls.py
path('posts/<int:pk>/like/',LikeListCreate.as_view(),name = 'post_likes'),
I am unable to implement logic in views.py module and serializers.py section too. Please help, thanks in advance
Git link to my project https://github.com/Anoop-George/BlogApp.git
You're serialising the request data but you've already extracted data from the request to get the user and the post, I would therefore suggest using that data to create the PostLike in your views.py in a standard way:
new_like = PostLikes(likeusers=request.user, likepost=likepost)
new_like.save()
I would also add that models are usually titled as singular items, i.e. PostLike and not PostLikes - you can refer to postlikes using the related_name of the ForeignKey field.
def post(self,request,pk):
likeusers = User.objects.get(id=2)// user find for testing purpose
likepost = Post.objects.filter(pk=pk)
check = PostLikes.objects.filter(Q(likeusers=like_user) & Q(likepost = likepost.last() ))
if(check.exists()):
return Response({
"status": status.HTTP_400_BAD_REQUEST,
"message":"Already Liked"
})
new_like = PostLikes.objects.create(likeusers=likeusers, likepost=likepost.last())
new_like.save()
serializer = PostlikeSerializer(new_like)
return Response(serializer.data,status=status.HTTP_201_CREATED)

How do i query model managers in my function based views for single_page(detail.html)

I'm finding it difficult to query a custom django model manager in my function based detail view. How can i resolve this?
I'm using django 2.2.
in my models.py file, i have this code below, which works perfectly. Querying for the listview is working fine and when i query the detail view using get_object_or_404(Modelname, id), the detail views works too but when i try to query it using my custom model manager, i keep getting this error
"movie_detail() got an unexpected keyword argument 'id'".
i've also tried removing--->
def get_absolute_url(self):
return reverse('core:movie_detail', args=[self.id,])
from my movie model when querying the model manager, but am still get same error
How can i resolve this?
my models.py
class MovieManager(models.Manager):
def all_with_related_persons(self):
qs = self.get_queryset()
qs = qs.select_related('director')
qs = qs.prefetch_related('writers', 'actors')
return qs
class Movie(models.Model):
NOT_RATED = 0
RATED_G = 1
RATED_PG = 2
RATED_R = 3
RATINGS = (
(NOT_RATED, 'NR - Not Rated'),
(RATED_G, 'G - General Audiences'),
(RATED_PG, ' PG - Parental Guidance' 'Suggested'),
(RATED_R, 'R - Restricted'),
)
title = models.CharField(max_length=140)
plot = models.TextField()
year = models.PositiveIntegerField()
rating = models.IntegerField(choices=RATINGS, default=NOT_RATED)
runtime = models.PositiveIntegerField()
website = models.URLField(blank=True)
director = models.ForeignKey(to='Person',
on_delete=models.SET_NULL,
related_name="directed",
null=True,
blank=True)
writer = models.ManyToManyField(to="Person", related_name="writing_credits", blank=True)
actors = models.ManyToManyField(to="Person", through="Role", related_name="acting_credits", blank=True)
objects = MovieManager()
def __str__(self):
return '{} ({})'.format(self.title, self.year)
def get_absolute_url(self):
return reverse('core:movie_detail', args=[self.id,])
class Meta:
ordering = ('-year', 'title',)
<--- Views.py --->
My List view
def movie_list(request):
object_list = Movie.objects.all()
paginator = Paginator(object_list, 12)
page_number = request.GET.get('page', 1)
try:
page = paginator.page(page_number)
except PageNotAnInteger:
# If page is not an integer deliver the first page
page = paginator.page(1)
except EmptyPage:
# If page is out of range deliver last page of results
page = paginator.page(paginator.num_pages)
context = {
'object_list': object_list,
'products': page,
'page': page,
}
template = 'core/movie_list.html'
return render(request, template, context)
DetailView without custom model manager.(This works)
def movie_detail(request, id):
object_list = get_object_or_404(Person, id=id)
context = {'movie': object_list}
template = 'core/person_detail.html'
return render(request, template, context)
DetailView with custom model manager.(This doesn't work. throws an error "movie_detail() got an unexpected keyword argument 'id'")
def movie_detail(request):
object_list = Movie.objects.all_with_related_persons()
context = {'movie': object_list}
template = 'core/movie_detail.html'
return render(request, template, context)
My url path to the detail_view
path('<id>/', views.movie_detail, name="movie_detail"),
I expect detail view to return queries based on what i queried in my custom model manager.
Your url pattern for the movie_detail view is passing an id kwarg to your view, so your view needs to accept this id as argument. Instead of
def movie_detail(request)
you should define
def movie_detail(request, id)
The error you see just says: movie_detail was called with keyword argument id, meaning it was called like this: movie_detail(request=the_request, id=some_id) which can't work if it's defined to only have one argument, request.
But also, since you're making a detail view for one object, you should probably do something with the id to select the specific object:
def movie_detail(request, id):
object_list = Movie.objects.all_with_related_persons()
try:
movie = object_list.get(id=id)
except Movie.DoesNotExist:
raise Http404
context = {'movie': movie}
template = 'core/movie_detail.html'
return render(request, template, context)

how to get() this model that belongs to userprofile.team

I'm struggling getting this view to work. In the code I have included a comment that indicated where the issue is. Basically I can not for the life of me get the TeamsWeeklyMasterSchedule object that relates to the EmployeeProfile.team
Models
class Team(models.Model):
name = models.CharField(max_length=10)
def __str__(self):
"""Return a string representation of the model."""
return self.name
class TeamsWeeklyMasterSchedule(models.Model):
"""Hours Available For That Day"""
team = models.ForeignKey(Team, on_delete=models.CASCADE)
class EmloyeeProfile(models.Model):
owner = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, )
team = models.ForeignKey(Team, on_delete=models.CASCADE,)
View
#login_required
def employee(request):
"""The home page"""
profile = EmployeeProfile.objects.filter(owner=request.user)
# I Cannot make this get() work!
teams_weekly_master_schedule = TeamsWeeklyMasterSchedule.objects.get()
context = {
'profile': profile,
'teams_weekly_master_schedule': teams_weekly_master_schedule,
}
return render(request, 'portal/employee.html', context)
What I've Tried
teams_weekly_master_schedule = TeamsWeeklyMasterSchedule.objects.get(team=profile.team)
teams_weekly_master_schedule = TeamsWeeklyMasterSchedule.objects.get(team=request.user.team)
I was able to replicate the problem and I solved it with this:
def employee(request):
"""The home page"""
profile = EmployeeProfile.objects.get(owner=request.user)
teams_weekly_master_schedule = TeamsWeeklyMasterSchedule.objects.get(team = profile.team)
context = {
'profile': profile,
'teams_weekly_master_schedule': teams_weekly_master_schedule,
}
return render(request, 'test.html', context)
The first problem was that on line 3, you used filter to retrieve one EmployeeProfile object. Using filter returns a queryset, which can't be accessed as an object.
When you use GET, you can use profile.team which returns the team you want.

Categories