In the below code Instead of {{ i.user }} I want to access a value from another table with {{ i.user }} as matching value. How to done it within HTML
{% for i in obj reversed %}
<div class="container">
<blockquote>
<header> {{ i.topic }} {{ i.user }} </header>
<p> {{ i.desc }} </p>
<footer> {{ i.time }} </footer>
</blockquote>
{% endfor %}
</div>
Here are My Models
from django.db import models
class Accounts(models.Model):
name=models.CharField(max_length=30)
phone=models.CharField(max_length=20,unique=True)
mail=models.EmailField()
password=models.CharField(max_length=20)
def __str__(self):
return self.name
class BlogPost(models.Model):
user=models.CharField(max_length=30)
topic=models.CharField(max_length=100)
desc=models.CharField(max_length=1000)
likes=models.IntegerField(null=True,default=0)
time=models.DateTimeField(null=True)
def __str__(self):
return self.user
And I want to get value from Accounts using Blogspot.user i.e {{ i.user }} in template
Thanks in Advance...
from django.contrib.auth.models import AbstractBaseUser
class Accounts(AbstractBaseUser):
name = models.CharField(max_length=30)
phone = models.CharField(max_length=20,unique=True)
mail = models.EmailField()
password = models.CharField(max_length=20)
def __str__(self):
return self.name
class BlogPost(models.Model):
user = models.ForeignKey(Accounts, related_name='accounts')
topic = models.CharField(max_length=100)
desc = models.CharField(max_length=1000)
likes = models.IntegerField(null=True,default=0)
time = models.DateTimeField(null=True)
def __str__(self):
return self.user
Now, using foreign key you can access accounts model attributes in your template.
Related
Im working n a record label website in Django 3 using Python3. (Artist, Release, Track structure)
I am attempting to filter out a list of all tracks based on the current artist page.
music/artist/
I'm thining to filter this in the context_processors file, but dont know how, and am willing to do it anyway that works if this is not possible.
artist.html
{% block body %}
<div class="container artistitem">
<h2>{{ artist.artist_name }}</h2>
<h3>{{ artist.artist_url }}</h3>
<h5>{{ artist.artist_id }}</h5>
<div class="artistimage"><img src="{{ artist.artist_logo.url }}"></div>
<div>
<h3>Discography</h3>
<p>
<ul>
<!-- for this artist id in all releases print all release name -->
<!-- {% for release.artist.id in all_releases %}
<li>
{{ release.release_title }}
</li>
{% endfor %} -->
<!-- for this artist id in all releases print all release name -->
{% for track in all_tracks_byartist %}
<li>
{{ track.track_title }}
</li>
{% endfor %}
</ul>
</p>
</div>
</div>
{% endblock %}
models.py
from django.db import models
# Create your models here.
class Artist(models.Model):
artist_name = models.CharField(max_length=250, default='')
artist_logo = models.FileField()
artist_url = models.URLField(blank=True)
def __str__(self):
return self.artist_name
class Release(models.Model):
artist = models.ForeignKey(Artist, on_delete=models.CASCADE, related_name='release')
release_title = models.CharField(max_length=500)
release_cover = models.FileField()
release_duration = models.IntegerField()
def __str__(self):
return self.release_title
class Track(models.Model):
release = models.ForeignKey(Release, default='', on_delete=models.CASCADE)
artist = models.ForeignKey(Artist, default='', on_delete=models.CASCADE)
track_title = models.CharField(max_length=200)
track_version = models.CharField(max_length=200)
track_genre = models.CharField(max_length=100)
track_duration = models.IntegerField()
track_number = models.SmallIntegerField()
class Meta:
ordering = ["track_number"]
def __str__(self):
return self.track_title
app_name = 'music'
context_processors.py
from music.models import Artist, Release, Track
def all_artists(request):
artist = Artist.objects.all()
return {'all_artists':artist}
def all_releases(request):
release = Release.objects.all()
return {'all_releases':release}
def all_tracks(request):
track = Track.objects.all()
return {'all_tracks':track}
def all_tracks_byartist(request):
track = Track.objects.all()
return {'all_tracks_byartist':track}
If you need any other files please let me know.
use reverse relation for getting tracks of a specific artist.
something like:
{% for track in artist.track_set.all %}
<li>
{{ track.track_title }}
</li>
{% endfor %}
I want to create a django form that captures user entry such as name, address, age. For this type of information I can create a model such as
class GeneralUserInfo(models.Model):
firstname = models.CharField()
lastname = models.CharField()
address = models.CharField()
# etc....
However, I also want to capture maybe some information like their class schedule or family information.
class UserSchedule(models.Model):
course_number = model.IntegerField()
course_name = model.CharField()
# etc....
class FamilyInfo(models.Model):
family_member_type = models.CharField(choices = MEMBER_CHOICES) # mother, father, sibling
family_member_name = models.CharField() # jon doe
# etc....
where by each user, the number of courses and number of family members could vary.
I would like the form to look something like below
with a simple submit button to send things off to be saved.
My question is, how should I structure the form template considering there are multiple models?
The answer to the above question can take a couple of forms. I'll rewrite the example above to add more context.
Say there's a student, Ashley, with college course work (say she's taking 4 course) and with family (mom, pop, sis, bro). I'd like to capture all this information for Ashley. So I've written the following models.py
class Student(models.Model):
firstname = models.CharField()
lastname = models.CharField()
address = models.CharField()
# etc....
class Course(models.Model):
user = models.ForeignKey(GeneralUserInfo, on_delete = models.CASCADE)
course_number = model.IntegerField()
course_name = model.CharField()
# etc....
class Family(models.Model):
user = models.ForeignKey(GeneralUserInfo, on_delete = models.CASCADE)
family_member_type = models.CharField(choices = MEMBER_CHOICES) # mother, father, sibling
family_member_name = models.CharField() # jon doe
# etc....
Next, what is needed is to use inlineformset_factory inside your views.
You could potentially have two views in views.py. One that creates the student, and another that edits the information belonging to that student.
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import StudentForm
from django.forms import inlineformset_factory
from .models import Student, Course, Family
#login_required
def createstudent(request):
context = {'studentform': StudentForm}
if request.method == "POST":
form = StudentForm(request.POST)
if form.is_valid():
instance = form.save(commit = False) # https://www.youtube.com/watch?v=2h57cqFRcqg
instance.user = request.user
instance.save()
messages.success(request, "Saved new contact!")
return redirect('home')
return render(request, 'mainapp/createstudent.html', context)
#login_required
def editview(request, id):
student = Student.objects.get(pk = id)
CourseFormSet = inlineformset_factory(Student, Course, fields = ('name', 'skill'), extra=5, max_num=5)
FamilyFormSet = inlineformset_factory(Student, Family, fields = ('name', 'skill'), extra=5, max_num=5)
if request.method == "POST":
courseformset = CourseFormSet(request.POST, instance = contact)
Familyform = FamilyFormSet(request.POST, instance = contact)
if courseformset.is_valid():
courseformset.save()
if Familyform.is_valid():
Familyform.save()
if courseformset.is_valid() or Familyform.is_valid():
messages.success(request, "Saved new information")
return redirect('editview', id=id)
courseformset = CourseFormSet(instance = contact)
Familyform = FamilyFormSet(instance = contact)
context = {'courseformset': courseformset, 'title': 'Edit View', 'Familyform': Familyform}
return render(request, 'mainapp/editview.html', context)
Then inside an edit view template, editview.html
{% extends "mainapp/base.html" %}
{% block content %}
<h1>{{ title }}</h1>
<br>
<h5>Edit the form below</h5>
<br>
<form method = "POST">
<br>
<h2>Courses</h2>
<br>
{% csrf_token %}
{{ courseformset.management_form }}
{% for form in courseformset %}
<article class="media content-section">
<div class="media-body">
{{ form.as_p }}
</div>
</article>
{% endfor %}
<br>
<h2>Family</h2>
<br>
{{ Familyform.management_form }}
{% for form in Familyform %}
<article class="media content-section">
<div class="media-body">
{{ form.as_p }}
</div>
</article>
{% endfor %}
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Submit</button>
</div>
</form>
{% endblock content %}
This is just an example. However, for a whole project example, please see: https://github.com/Johnnyboycurtis/onlineforms-project/
I am trying to do that a user can modify his/her profile.
At the rigth (in the image attached in url) we can see that the user has coins and wallets (Bitcoin, Ethereum and coinbase)
The goal is that in the left form, the user could change his/her data and add or remove coins and wallets.
I need:
How can I do that with ModelMultipleChoiceField?
How can I show the user's data in the input when the form is loaded?. e.g: antonigalile will be un name input
I would like that my widget looks like that:
Here my files:
models.py
from django.db import models
from django.utils.timezone import now
from django.contrib.auth.models import AbstractUser
class Coin(models.Model):
name = models.CharField(unique=True,max_length=50)
url = models.CharField(max_length=200)
transaction_fee = models.FloatField(default=0.0,blank=True)
price = models.FloatField(default=0.0,blank=True)
market_cap = models.IntegerField(default=0,blank=True)
volume = models.IntegerField(default=0,blank=True)
circulating = models.IntegerField(default=0,blank=True)
change = models.FloatField(default=0.0,blank=True)
def __str__(self):
return self.name
class Wallet(models.Model):
name = models.CharField(unique=True,max_length=50)
url = models.CharField(max_length=200)
coins = models.ManyToManyField(Coin)
def __str__(self):
return self.name
class Usuario(AbstractUser):
name = models.CharField(max_length=12, help_text="The name must be between 2 and 12 characters")
email = models.EmailField(max_length=60, unique=True, help_text="The email must be between 5 and 30 characters")
password = models.CharField(max_length=78)
change_password_code = models.CharField(blank=True,max_length=15)
activated = models.BooleanField(default=False)
activated_code = models.CharField(default="",max_length=15)
ip = models.CharField(blank=True,max_length=15)
last_login = models.DateField(default=now)
wallets = models.ManyToManyField(Wallet)
coins = models.ManyToManyField(Coin)
avatar = models.CharField(blank=True,default="bitcoin.png",max_length=15)
delete_code = models.CharField(default="",max_length=9,blank=True)
two_factors_auth = models.BooleanField(default=False)
two_factors_auth_code = models.CharField(default="",max_length=12,blank=True)
fingerprint = models.CharField(max_length=64,blank=True)
forms.py
class EditProfileForm(forms.ModelForm):
class Meta:
model = Usuario
exclude = ()
wallets = forms.ModelMultipleChoiceField(queryset=Wallet.objects.all(),to_field_name="name")
name = forms.CharField(label='Name')
email = forms.EmailField(label='Email')
two_factors_auth = forms.BooleanField()
coins = forms.ModelMultipleChoiceField(queryset=Coin.objects.all(),to_field_name="name")
form.html
<form method="post">
{% csrf_token %}
<div class="form-group">
<p> {{ edit_profile_form.name.label }} </p>
{% render_field edit_profile_form.name class+="form-control" %}
{{ edit_profile_form.name.errors }}
</div>
<div class="form-group">
<p> {{ edit_profile_form.email.label }} </p>
{% render_field edit_profile_form.email class+="form-control" %}
{{ edit_profile_form.email.errors }}
</div>
<div class="form-group">
<p>My Wallets</p>
{{ edit_profile_form.wallets}}
{{ edit_profile_form.wallets.errors }}
</div>
<div class="form-group">
<p>My Coins</p>
{{ edit_profile_form.coins }}
{{ edit_profile_form.coins.errors }}
</div>
<div class="form-group">
<p>Activate two factor authentication
{{ edit_profile_form.two_factors_auth }}</p>
{{ edit_profile_form.two_factors_auth.errors }}
</div>
<button type="submit" name="profileButton" class="btn btn-primary">Save</button>
</form>
views.py (no finished)
class userPageView(TemplateView):
template_name = 'user.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['edit_profile_form'] = EditProfileForm(prefix='contact')
return context
def post(self, request, *args, **kwargs):
return render(request, 'user.html')
¿What can I do?
Thanks
I have a little problem with annotate. I want to display records from my class Kategorie in the main html file. I used the annotate method to take the query from db. I used in the second class Firmy the ForeignKey to class Kategorie. Now I dont know how to display for example how many websites added in the class Firmy are in the for example in category Business. Now I have something like: "Business (2)(3)(4)" when I used annotate with count by id. This is my models.py
from django.db import models
from django.utils import timezone
class Kategorie(models.Model):
glowna = models.CharField(max_length=150, verbose_name='Kategoria')
class Meta:
verbose_name='Kategoria'
verbose_name_plural='Kategorie'
def __str__(self):
return self.glowna
class Witryna(models.Model):
nazwa = models.CharField(default="", max_length=150, verbose_name = 'Nazwa strony')
adres_www = models.CharField(max_length=70, verbose_name='Adres www')
slug = models.SlugField(max_length=250, verbose_name='Przyjazny adres url')
email = models.CharField(max_length=100, verbose_name='Adres e-mail')
text = models.TextField(max_length=3000, verbose_name='Opis strony')
kategoria = models.ForeignKey(Kategorie, verbose_name='Kategoria')
data_publikacji = models.DateTimeField(blank=True, null=True, verbose_name='Data publikacji')
class Meta:
verbose_name='Strona www'
verbose_name_plural = 'Strony www'
def publikacja(self):
self.data_publikacji=timezone.now()
self.save()
def __str__(self):
return self.nazwa
And some part from views.py
from django.db.models import Count
wpisy_kat = Kategorie.objects.annotate(cnt_witryna=Count('Witryna'))
So what kind of method or tags I have to use to display for example:
Business(34)
Industry(21)
Health Care(11)
where the name od category is field from class Kategorie and integer is a result from query to database how many websites are in for example Business category?
My html file is:
{% for kategoria in kategorie %}
<table>
<tr>
<td>
<li>{{ kategoria.glowna|linebreaksbr }} </li>
{% for wpis in wpisy_kat %}
{{ wpis }} ({{ cat.cnt_witryna }})
{% endfor %}
</td>
</tr>
</table>
{% endfor %}
and the main html file:
{% include 'firmy/header.html' %}
<html>
<body>
<p>
<center>
<ul id="menu">
<li>Strona główna</li>
<li>Jak dodać stronę</li>
<li>Regulamin</li>
<li>Kontakt</li>
</ul>
</center>
<div class="glowna">
<div class="lewe_menu">
<h3><center>Ostatnio dodane</center></h3>
{%include 'firmy/widok_strony.html'%}
</div>
<div class="srodek">
<h3><center>Kategorie</center></h3>
<center>{%include 'firmy/widok_kategorii.html'%} </center>
</div>
<div class="prawe_menu">
<h3><center>Reklama</center></h3>
<center>Tutaj wpisz kod reklamy </center>
</div>
{% include 'firmy/footer.html' %}
</div>
</body>
</html>
view.py file
from django.shortcuts import render, get_object_or_404
from .models import Witryna, Kategorie
from django.utils import timezone
from django.db.models import Count
def widok_strony(request):
firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
return render(request, 'firmy/widok_strony.html', {'firmy': firmy})
def widok_kategorii(request):
kategorie = Kategorie.objects.all()
wpisy_kat = Witryna.objects.annotate(cnt_kategoria=Count('kategoria'))
return render(request, 'firmy/widok_kategorii.html', {'kategorie': kategorie, 'wpisy_kat': wpisy_kat,})
def index(request):
firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
kategorie = Kategorie.objects.order_by('glowna')
wpisy_kat = Witryna.objects.annotate(cnt_witryna=Count('kategoria'))
return render(request, 'firmy/index.html', {'kategorie': kategorie, 'wpisy_kat': wpisy_kat, 'firmy': firmy})
def detale_strony(request, slug):
det_wpisu = get_object_or_404(Witryna, slug=slug)
firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
return render(request, 'firmy/detale_strony.html', {'det_wpisu': det_wpisu, 'firmy': firmy})
def detale_kat(request, slug_kat):
det_kategorii = get_object_or_404(Kategorie, slug_kat=slug_kat)
firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
return render(request, 'firmy/detale_kat.html', {'det_kategorii': det_kategorii, 'firmy': firmy})
Your view needs to return something like :
wpisy_kat = Kategorie.objects.annotate(cnt_witryna=Count('witryna'))
return render(request, 'app/template.html', {'wpisy_kat': wpisy_kat})
template.html :
<ul>
{% for cat in wpisy_kat %}
<li>{{ cat }} ({{ cat.cnt_witryna }})</li>
{% endfor %}
</ul>
EDIT :
You can add sorting or filtering to the annotate query, no need to pass 2 parameters from the view, and no need to perform to for/loops :
replace the query in the view :
wpisy_kat = Kategorie.objects.annotate(cnt_witryna=Count('witryna')).order_by('glowna')
Then in the HTML:
<ul>
{% for cat in wpisy_kat %}
<li>{{ cat }} ({{ cat.cnt_witryna }}) </li>
{% endfor %}
</ul>
I'm a bit confused on how Forms and ModelForms work, I want to create colored buttons based on a field value while creating a form.
{% for category in form.category %}
<label class="colored-icon btn btn-default btn-sm" style="background-color: {{ category.color }}">
{{ category.choice_label|slice:"1" }}
{{ category.tag }}
</label>
{% endfor %}
The problem is that category.colorobviously doesn't have value I need.
My form is based on a "Transaction" model. I need to somehow access "color" attribute from "Category" model, which looks like this:
forms.py
class TransactionForm(forms.ModelForm):
class Meta:
model = Transaction
models.py
class Transaction(models.Model):
category = models.ForeignKey(Category, default='Unspecified')
class Category(models.Model):
color = models.CharField(max_length=10)
views.py
def index(request):
form = TransactionForm(request.POST)
new_transaction = form.save()
context = {
'form': form,
}
return render(request, 'index.html', context)
What's the proper way to select and pass "category.color" to each field I'm creating?
Thanks.
Try this:
class Category(models.Model):
color = models.CharField(max_length=10)
def __unicode__(self):
return '%s - %s' % (self.OtherFieldName, self.color)
that way inside the select should look like this
<option value='CategoryID'>OtherFieldName_value - color_value</option>
Alright, I've figured out a way to do so with modified #warath-coder answer. I wasn't able to access "_value" property if it was a way to go, so I had to implement "split" filter and use it to split value I've got and use "color" part of this value.
models.py
class Category(models.Model):
color = models.CharField(max_length=10)
def __unicode__(self):
return '%s - %s' % (self.OtherFieldName, self.color)
split_filter.py
#register.filter(name='split')
def split(value, arg):
return value.split(arg)
index.html
{% with category.choice_label|split:"-" as label %}
<label class="btn btn-default btn-sm" style="background-color: {{ label.1 }}">
{{ label.0 }}
{{ category.tag }}
</label>
{% endwith %}