Gabbywells
Gabbywells

Reputation: 267

how to display information entered by a user into a django model in the User profile

I'm kind of new to django, I'm working on a project currently. It is a website where people can look for houses to rent. Users will be able to create accounts, search for houses to rent and create listings about the houses they want to rent out.

I created a model to save all the information about houses that users want to rent out. I need to filter this information and display each user's listing on their profile. I have searched online but no solution yet.

Really need help.

models.py

from django.db import models
from django.contrib.auth.models import User
class Myhouses(models.Model):
    Available = 'A'
    Not_Available = 'NA'
    Availability = (
        (Available, 'Available'),
        (Not_Available, 'Not_Available'),
    )
    name_of_accomodation = models.CharField(max_length=200)
    type_of_room = models.CharField(max_length=200)
    house_rent = models.IntegerField()
    availability = models.CharField(max_length=2, choices=Availability, default=Available,)
    location = models.CharField(max_length=200)
    nearest_institution = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    image = models.ImageField(upload_to='profile_image')
    author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='author')

    def __str__(self):
        return self.name_of_accomodation

view.py

class ListingByUser(LoginRequiredMixin, generic.ListView): 
    model = Myhouses
    template_name ='houses/ListingByUser.html'
    paginate_by = 10
    def get_queryset(self):
        return Myhouses.objects.filter(author=self.request.user)

urls.py

from django.conf.urls import url, include
from . import views
from django.contrib.auth.models import User


urlpatterns = [
    url(r'^addlisting/$', views.addlisting, name='addlisting'),
    url(r'^mylisting/', views.ListingByUser.as_view(), name='ListingByUser')
]

Template

<ul>
{% for houses in myhouses_list %}
    <li>{{ houses.name_of_accomodation }}</li>

{%endfor %}
</ul>

Upvotes: 0

Views: 148

Answers (1)

Daniel Ruiz
Daniel Ruiz

Reputation: 620

Taking a quick view of your code, there is something that stuck me on your ListingByUser view: you override the get method only to set some attributes that are normaly defined as class attributes. That also could be preventing your view to actually get your models out of the database (via calling the get_queryset method) and rendering a proper response.

Edit

I found there's also a problem linking your template to the response the ListingByUser view is rendering. As far as I know, Django views doesn't look into the variable template_name for getting the response's template. But it does call a method get_template_names which returns a list of template names given as strings.

Try to modify it in this way:

views.py

class ListingByUser(LoginRequiredMixin, generic.ListView):
    model = Myhouses
    template_name ='myhouses/listing_by_user.html'
    paginate_by = 10

    def get_queryset(self):
        return Myhouses.objects.filter(author=self.request.user)

    def get_template_names(self):
        return [self.template_name]

Upvotes: 2

Related Questions