How to load a parameter from an object in an object? - python

class Product(models.Model):
subcategory = models.ManyToManyField(Subcategory, related_name="Category")
name = models.CharField(max_length=32, unique=True)
title = models.CharField(max_length=3000)
ean = models.PositiveIntegerField(blank=True, null=True, unique=True)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, blank=True, null=True)
origin_name = models.CharField(max_length=32, blank=True, null=True)
quantity = models.PositiveIntegerField(blank=True, null=True)
highlights = models.TextField(max_length=3000, blank=True, null=True)
description = models.TextField(max_length=3000, blank=True, null=True)
delivery = models.TextField(max_length=3000, blank=True, null=True)
selling_price = models.DecimalField(max_digits=9, decimal_places=2)
slug = models.SlugField(unique=True)
class Infobox(models.Model):
name = models.CharField(max_length=32)
measurment = models.CharField(max_length=32)
resolution = models.CharField(max_length=32)
product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True)
I would like to display on my detail page all infobox objects that are linked to the device, do any of you know how to do this?
THANKSSSS <3

urls.py
Add below to your urlpatterns:
path('view_infoboxes/<int:product_id>', views.view_infoboxes, name='view_infoboxes'),
views.py
def view_infoboxes(request, product_id):
template = loader.get_template('page.html')
context = {"infoboxes": Infobox.objects.filter(product=product_id)}
return HttpResponse(template.render(context, request))
page.html
...
<div class="row">
{% for infobox in infoboxes %}
<p>{{ infobox.name }}</p>
{% endfor %}
</div>
...

Related

Selecting one row from Foreign Key in Django

I have the following models in Django:
class Kingdom(models.Model) :
class Meta:
ordering = ('kingdom_name', )
kingdom_name = models.CharField(max_length=128, null=True, blank=True)
def __str__(self) :
return self.kingdom_name
class Phylum_Clade(models.Model) :
class Meta:
ordering = ('phylum_name', )
phylum_name = models.CharField(max_length=128, null=True, blank=True)
kingdom = models.ForeignKey(Kingdom, on_delete=models.CASCADE, null=True)
def __str__(self) :
return self.phylum_name
class Classe_Clade(models.Model) :
class Meta:
ordering = ('classe_name', )
classe_name = models.CharField(max_length=128, blank=True, null=True)
phylum_clade = models.ForeignKey(Phylum_Clade, on_delete=models.CASCADE, null=True)
kingdom = models.ForeignKey(Kingdom, on_delete=models.CASCADE, null=True)
def __str__(self) :
return self.classe_name
class Ordre(models.Model) :
class Meta:
ordering = ('ordre_name', )
ordre_name = models.CharField(max_length=128, blank=True, null=True)
classe_clade = models.ForeignKey(Classe_Clade, on_delete=models.CASCADE, null=True)
phylum_clade = models.ForeignKey(Phylum_Clade, on_delete=models.CASCADE, null=True)
kingdom = models.ForeignKey(Kingdom, on_delete=models.CASCADE, null=True)
def __str__(self) :
return self.ordre_name
class Famille(models.Model) :
class Meta:
ordering = ('famille_name', )
famille_name = models.CharField(max_length=128, blank=True, null=True)
ordre = models.ForeignKey(Ordre, on_delete=models.CASCADE, null=True)
classe_clade = models.ForeignKey(Classe_Clade, on_delete=models.CASCADE, null=True)
phylum_clade = models.ForeignKey(Phylum_Clade, on_delete=models.CASCADE, null=True)
kingdom = models.ForeignKey(Kingdom, on_delete=models.CASCADE, null=True)
def __str__(self) :
return self.famille_name
class Binomiale(models.Model) :
class Meta:
ordering = ('binomiale', )
nom = models.CharField(max_length=128, blank=True)
name = models.CharField(max_length=128, blank=True)
binomiale = models.CharField(max_length=128, blank=True)
famille = models.ForeignKey(Famille, related_name='famille_names', on_delete=models.CASCADE, null=True)
ordre = models.ForeignKey(Ordre, related_name='ordre_names', on_delete=models.CASCADE, null=True)
classe_clade = models.ForeignKey(Classe_Clade, related_name='classe_names', on_delete=models.CASCADE, null=True)
phylum_clade = models.ForeignKey(Phylum_Clade, related_name='phylum_names', on_delete=models.CASCADE, null=True)
kingdom = models.ForeignKey(Kingdom, related_name='kingdom_names', on_delete=models.CASCADE, null=True)
image = models.ImageField(blank=False, default='no_picture.png')
img_thumbnail = models.ImageField(blank=False, default='no_picture.png')
observations = models.ManyToManyField(settings.AUTH_USER_MODEL,
through='Observation', related_name='observations')
def __str__(self) :
return self.binomiale
In Views.py I have the following code:
class Famille1(OwnerListView):
model = Binomiale
template_name = 'database/famille1.html'
template_name2 = 'database/especes.html'
def get(self, request) :
strval = request.GET.get("search", False)
if strval :
query = Q(name__icontains=strval) | Q(nom__icontains=strval)
query.add(Q(name__icontains=strval) | Q(nom__icontains=strval), Q.OR)
data_list = Binomiale.objects.filter(query).select_related().distinct().order_by('nom')[:12]
ctx = {'data_list' : data_list, 'search': strval}
return render(request, self.template_name2, ctx)
else:
if request.user.is_authenticated:
famille_list1 = Binomiale.objects.select_related("famille").distinct().order_by("famille__famille_name")[:12]
ctx = {'famille_list1' : famille_list1, 'search': strval}
return render(request, self.template_name, ctx)
In my html file I use the following code:
{% if famille_list1 %}
<div class="row row-cols-12 g-3">
{% for data in famille_list1 %}
<div class="col-sm-6 col-lg-2">
<a class="linkStyles3" href="{% url 'database:data_detail' data.id %}">{{ data.famille }}</a><br/>
<h6 style="color:black">{{ data.nom }}</h6>
<img class="img-thumbnail" src="{% get_media_prefix %}{{data.img_thumbnail}}" style="width:50%">
</div>
{% endfor %}
</div>
{% endif %}
</p>
The output of this is similar to the following sqlite3 command, and output (partial):
sqlite> select famille_name, nom, name, img_thumbnail from database_binomiale inner join database_famille on database_famille.id = database_binomiale.famille_id order by famille_id;
Apidae|Bourdon terreste|Bumble bee|BumbleBee_thumb.jpg
Apidae|Abeille à miel|Honey bee|HoneyBee_thumb.jpg
Apidae|Abeille à longue corne|Long Horned Bee|LongHornedBee_thumb.jpg
Apidae|Bourdon fébrile|Common Eastern Bumble Bee|CommonEasternBumbleBee_thumb.jpg
Ardeidae|Héron cendré|Grey heron|Heron_thumb.jpg
Simuliidae|Mouche noire|Black fly|BlackFly_thumb.jpg
Muscidae|Mouche domestique|House fly|HouseFly_thumb.jpg
Culicidae|Moustique|Mosquito|Mosquito_thumb.jpg
Culicidae|Moustiques éléphants|Elephant mosquito|ElephantMosquito_thumb.jpg
Corvidae|Grand Corbeau|Common Raven|Raven_thumb2.jpg
Corvidae|Geai bleu|Blue jay|BlueJay_thumb.jpg
Cardinalidae|Cardinal à poitrine rose|Rose-Breasted Grosbeak|Grosbeak_thumb.jpg
Cardinalidae|Cardinal rouge|Northern Cardinal|Cardinal_thumb2.jpg
Mustelidae|Loutre de rivière|North American River Otter|Otter_thumb2.jpg
Mustelidae|Hermine|Stoat|Stoat_thumb.jpg
My problem is that I do not want repeats of each class "Apidae","Cardinalidae","Mustelidae" etc. I want just a single example, with its image to be displayed. I have banged my head against a wall on this for longer than I care to admit.
Can someone help me?
Thankyou!
I think that you should query on the Famille model and thus check the nom, name, etc. of the related Binomiale model objects with:
data_list = Binomiale.objects.filter(
Q(famille_names__name__icontains=strval) | Q(famille_names__nom__icontains=strval)
).distinct()
The famille_names__ lookup is due to the value for the related_name=.. parameter [Django-doc], which does not make much sense.
Note: The related_name=… parameter [Django-doc]
is the name of the relation in reverse, so from the Famille model to the Binomiale
model in this case. Therefore it (often) makes not much sense to name it the
same as the forward relation. You thus might want to consider renaming the famille_names relation to binomales.

Django/python images not displayed

I'm trying to show an image in Django, the problem is it won't show up when I add the HTML template, I have tried all combinations (ex: {{ cars.image_main.url }}, {{ car.image_main.url }}).
If I delete all the HTML form Template and write {{ cars.image_main.url }} the image will show up. but When I put the HTML template back and insert the {{ cars.image_main.url }} into the code, the image does show up.
models.py:
class Car(models.Model):
dealer = models.ForeignKey(Dealer, on_delete=models.DO_NOTHING)
brand = models.CharField(max_length=100)
CATEGORY = (
('New', 'New'),
('Used', 'Used')
)
category = models.CharField(max_length=50, choices=CATEGORY)
image_main = models.ImageField(upload_to='images')
image1 = models.ImageField(upload_to='images', blank=True)
image2 = models.ImageField(upload_to='images', blank=True)
image3 = models.ImageField(upload_to='images', blank=True)
engine = models.CharField(max_length=100, blank=True)
stock_number = models.IntegerField(blank=True, null=True)
mpg = models.CharField(max_length=100, blank=True)
exterior_color = models.CharField(max_length=100, blank=True)
interior_color = models.CharField(max_length=100, blank=True)
drivetrain = models.CharField(max_length=100, blank=True)
mileage = models.IntegerField(blank=True, null=True)
sold = models.BooleanField(default=False, blank=False)
transmission = models.CharField(max_length=50, blank=True)
YEAR_CHOICES = [(r, r) for r in range(2005, datetime.date.today().year+1)]
year = models.IntegerField(
('year'), choices=YEAR_CHOICES, default=datetime.datetime.now().year)
power = models.IntegerField()
fuel = models.CharField(max_length=50, blank=True)
price = models.IntegerField()
description = models.TextField()
date = models.DateField()
def __str__(self):
return self.brand
def get_absolute_url(self):
return reverse('car_detail', kwargs={
'car_id': self.id
})
views.py:
def car_detail(request, car_id):
cars = get_object_or_404(Car, id=car_id)
context = {
'cars': cars
}
return render(request, 'car_detail.html', context)
car_detail.html:
<li data-thumb="images/thumbnail1.jpg"> <img src="images/thumbnail1.jpg" alt="" /> </li>
Try this:
car_detail.html:
<li data-thumb="images/thumbnail1.jpg"> <img src="{{ cars.image_main.url }}" alt="" /> </li>

How to render data from multiple models django

I want to render data to my webpage from my django app however only two of the required slots are being rendered
my models are:
class Order(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True)
date_ordered = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=100, null=True)
class OrderItem(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
quantity = models.IntegerField(default=0, null=True, blank=True)
date_added = models.DateTimeField(auto_now_add=True)
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=200, null=True)
email = models.CharField(max_length=200, null=True)
class Product(models.Model):
name = models.CharField(max_length=200)
price = models.DecimalField(max_digits=7, decimal_places=2)
digital = models.BooleanField(default=False,null=True, blank=True)
image = models.ImageField(null=True , blank=True)
description = models.TextField(max_length=5000, null=True)
points = models.DecimalField(max_digits=5,decimal_places=0, null=True)
and my views are
def admin_dashboard (request):
order_list = Order.objects.all()
context = {'order':order_list}
template = "admin_dashboard.html"
return render(request, 'store/admin_dashboard.html', context)
my HTML is:
{% extends 'store/admin_main.html' %}
{% load static %}
{% block content %}
{% for order in order %}
<h6>{{ order.transaction_id }}</h6>
<p>{{ order.customer }}</p>
<p>{{ order.shippingaddress }}</p>
<p>{{ order.orderitem }}</p>
{% endfor%}
{% endblock content %}
1598061443.212917
userNew
which is just the transaction id and user.
how can I have all the rest of fields filled

Trying to reference foreign key field...Why is it also displaying the name of the referenced table?

I'm trying to display data from my template. The issue I'm having is with the foreign key in the BattingStats table that references playerid of the PlayerInfo table. When I get it to display, the data for that field is showing but it is wrapped in parenthesis and preceded by ReferencedTable object. So for me it looks like this PlayerInfo object (smithjo05). Why would it be doing that and how would i get it to just show the playerid? Help is appreicated. Thanks.
VIEWS
def battingview(request):
playerinfo = PlayerInfo.objects.all()
playerstats = BattingStats.objects.filter(year=2018)
return render(request, 'playerstats/battingRegStnrd2018.html', {'playerinfo':playerinfo,'playerstats': playerstats})
MODELS
class BattingStats(models.Model):
id = models.IntegerField(db_column='ID', primary_key=True)
playerid = models.ForeignKey('PlayerInfo', models.DO_NOTHING, db_column='playerID', blank=True, null=True)
player = models.CharField(db_column='Player', max_length=255, blank=True, null=True)
hr = models.IntegerField(db_column='HR', blank=True, null=True)
rbi = models.IntegerField(db_column='RBI', blank=True, null=True)
ba = models.FloatField(db_column='BA', blank=True, null=True)
class PlayerInfo(models.Model):
playerid = models.CharField(db_column='playerID', primary_key=True, max_length=255)
namefirst = models.CharField(db_column='nameFirst', max_length=255, blank=True, null=True)
namelast = models.CharField(db_column='nameLast', max_length=255, blank=True, null=True)
height = models.IntegerField(blank=True, null=True)
debut = models.CharField(max_length=255, blank=True, null=True)
finalgame = models.CharField(db_column='finalGame', max_length=255, blank=True, null=True)
HTML
{% for index in playerstats %}
<td>{{ index.playerid }}</td>
<td>{{ index.year}}</td>
<td>{{ index.age}}</td>
<td>{{ index.team}}</td>
<td>{{ index.league}}</td>
{% endfor %}
{% for index in playerstats %}
{{ index.playerid }}
{% endfor %}
Browser
PlayerInfo object (smithjo05)
PlayerInfo object (cruzne02)
PlayerInfo object (jonesad01)
You just need to add __str__ method to your PlayerInfo model:
class PlayerInfo(models.Model):
playerid = models.CharField(db_column='playerID', primary_key=True, max_length=255)
namefirst = models.CharField(db_column='nameFirst', max_length=255, blank=True, null=True)
namelast = models.CharField(db_column='nameLast', max_length=255, blank=True, null=True)
height = models.IntegerField(blank=True, null=True)
debut = models.CharField(max_length=255, blank=True, null=True)
finalgame = models.CharField(db_column='finalGame', max_length=255, blank=True, null=True)
def __str__(self):
return self.playerid
This allows to change default representation of instance when you convert it to string, for example in templates.

Trying to access model in form by going through another model

I am not that good at queries, so I need some help. I have a Course model, and a TeacherData model. Each teacher has its own courses. But when a teacher makes an account I use a Teacher model. And if teacher_ID column from TeacherData doesn't match the one entered by the user, the account cannot be created.
Now, in my form I need to show Courses for each teacher, so that a Lecture instance can be created. I was thinking to use teacher_ID as bridge connecting Teacher model with TeacherData model and then I would be able to show the courses that only a specific teacher has.
This is what I tried, but can't figure out:
class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
name = models.CharField(max_length=30, null=True, blank=True, default=None)
surname = models.CharField(max_length=50, null=True, blank=True, default=None)
email = models.EmailField(unique=True, null=True, blank=True, default=None)
teacher_ID = models.CharField(unique=True, max_length=14,
validators=[RegexValidator(regex='^.{14}$',
message='The ID needs to be 14 characters long.')],
null=True, blank=True, default=None)
class Lecture(models.Model):
LECTURE_CHOICES = (
('Courses', 'Courses'),
('Seminars', 'Seminars'),
)
course = models.ForeignKey('Course', on_delete=models.CASCADE, default='', related_name='lectures',)
lecture_category = models.CharField(max_length=10, choices=LECTURE_CHOICES, default='Courses',)
lecture_title = models.CharField(max_length=100, blank=True, null=True)
content = models.TextField(blank=False, default=None)
class Course(models.Model):
study_programme = models.ForeignKey('StudyProgramme', on_delete=models.CASCADE, default='')
name = models.CharField(max_length=50, unique=True)
ects = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
description = models.TextField()
year = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
semester = models.IntegerField(choices=((1, "1"),
(2, "2"),
), default=None)
teacher1 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None,
verbose_name="Course Teacher", related_name='%(class)s_course_teacher')
teacher2 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None, null=True,
verbose_name="Seminar Teacher", related_name='%(class)s_seminar_teacher')
class TeacherData(models.Model):
name = models.CharField(max_length=30)
surname = models.CharField(max_length=50)
teacher_ID = models.CharField(unique=True, max_length=14)
notes = models.CharField(max_length=255, default=None, blank=True)
Run code snippetExpand snippet
class LectureForm(forms.ModelForm):
lecture_title = forms.CharField(max_length=100, required=True)
course = forms.ModelChoiceField(initial=Course.objects.first(), queryset=Course.objects.filter(
Q(teacher1__surname__in=[t.surname for t in TeacherData.objects.filter(
Q(teacher_ID__iexact=[x.teacher_ID for x in Teacher.objects.all()]))])))
class Meta:
model = Lecture
fields = ('course', 'lecture_category', 'lecture_title', 'content')
The expected behavior is when teacher is logged in, they would able to add a new lecture only for courses that they teach. I can achieve roughly the same effect by doing the following in a template
{% for data in teacher_data %}
{% if data.teacher_ID == user.teacher.teacher_ID %}
{% for course in courses %}
{% if course.teacher1 == data or course.teacher2 == data %}
<li>
{{ course.name }}
</li>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}

Categories

Resources