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
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)
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.
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)
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)
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.