How can i filter model field ForeignKey group django - django-models

i get All Profiles
i need just Profile of my group
How can I filter the options shown for a ForeignKey field in a Model Form?
In that form I want to show only the profiles in the group , so the user can only get a profile for the new user
class Profile_user(models.Model):
group = models.ForeignKey (Group, null=True ,on_delete=models.CASCADE)
name_Profile= models.CharField(max_length=200, null=True)
class Account(AbstractBaseUser , PermissionsMixin):
Profile = models.ForeignKey(Profile_user,null= True, on_delete=models.CASCADE)
email = models.EmailField(max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
class Registration_Form_Users(UserCreationForm):
class Meta:
model = Account
fields = ('email', 'username', 'password1', 'password2','Profile',)
form = Registration_Form_Users()
if request.method == 'POST':
form = Registration_Form_Users(request.POST)
form = Registration_Form_Users()
if request.method == 'POST':
form = Registration_Form_Users(request.POST)
<div class="col-md-6 mb-4">
<h6>Select Profile User</h6>
<fieldset class="form-group">
<select class="form-select" name="Profile"
<option ></option>
{% for item in form.Profile %}
{{item}}
{% endfor %}
</select>
</fieldset>

Related

Relationships in Django

I have following model class set up:
class Moc(models.Model):
.....my other fields.....
def __str__(self):
return self.moc_title
def get_absolute_url(self):
return reverse('moc_content_update', kwargs={'pk': self.pk})
class Verifier(models.Model):
moc = models.ForeignKey(Moc, related_name='verifiers', on_delete=models.CASCADE, default='1')
verifier_group = models.CharField(max_length=36, blank=True, null=True)
verifier_name = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE,)
verify_due = models.DateField(blank=True, null=True)
def __str__(self):
return str(self.id)
def save(self, *args, **kwargs):
created = not self.pk
super().save(*args, **kwargs)
if created:
VerifierSignOff.objects.create(verifier=self)
class VerifierSignOff(models.Model):
verifier = models.OneToOneField(Verifier, related_name='verifiersignoff', blank=True, null=True, on_delete=models.CASCADE)
approve = models.BooleanField(default=False)
reject = models.BooleanField(default=False)
signoff_date = models.DateField(auto_now=True)
note = models.TextField(max_length=256, blank=True)
def __str__(self):
return str(self.id)
My views are stetted up to create Moc instance, add Verifiers (in total 3 users) with respective VerifierSignOff and display it on my template without any issue.
My views.py:
def verify_coordinate_view(request, pk):
moc = get_object_or_404(Moc, pk=pk)
# I guess I need to have MOC Status logic here
return render(request, 'moc/moc_content_verification.html', context={'pk':pk, 'moc':moc, })
def verifier_signoff_view(request, pk):
verifiersignoff = VerifierSignOff.objects.get(pk=pk)
form = VerifierSignForm
if request.method == 'POST':
form = VerifierSignForm(request.POST, instance=verifiersignoff)
if form.is_valid():
form.save(commit=False)
if verifiersignoff.approve is True and verifiersignoff.reject is True:
return HttpResponseForbidden('You have either APPROVE or REJECT - operation not allowed!')
else:
form.save()
return redirect('verify_coordinate', pk=verifiersignoff.verifier.moc_id)
# return redirect('index')
else:
return render(request, 'moc/verify_signoff.html', context={'verifiersignoff': verifiersignoff, 'form': form})
I am displaying everything on my template i.e. I can add/remove my users, approve/reject the record, etc.
My aim is to display my Moc instance status i.e. VERIFIED (if 3oo3 Users approve the record) or REJECTED (if anyone from 3oo3 will reject record in other words if some user rejects record becomes not valid anymore despite if other 2 users already have had it approved).
I am rendering this process on my template using of for loop:
my pseudo template:
{% for obj in moc.verifiers.all %}
<tr style="text-align: center>
<td>---my sign-off / delete user---buttons</td>
<td>{{ forloop.counter }}{{ obj.verifier_group }}</td>
<td>{{ obj.verifier_name }}</td>
<td>{{ obj.verify_due|date:'d M Y' }}</td>
<td>
<input class="form-check-input-bg" type="checkbox" value="{{ obj.verifiersignoff.approve }}" checked onclick="return false">
</td>
<td>
<input class="form-check-input-bg" type="checkbox" value="{{ obj.verifiersignoff.reject }}" onclick="return false">
</td>
<td>{{ obj.verifiersignoff.signoff_date|date:'d M Y'}}</td>
<td>{{ obj.verifiersignoff.verified_by }}</td>
<td>{{ obj.note }}</td>
{% empty %}
<td colspan="8" style="WIDTH: 130px">No verifiers assigned yet...</td>
</tr>
{% endfor %}
I am able to display individual for loop object approve/reject status individually in my template, however I want to display consolidated STATUS as per my above description i.e. something like:
MOC STATUS: {{?????? I don't know how I can generate this variable in my logic ?????}}
My template snippet:

how to return a verification error message when a user is already authenticated with that same Email address or when the email already exists

i need help on how to return a validation error message when a user try's to register with the already registered email. below its my code
views.py
from audioop import reverse
from email import policy
from multiprocessing import context
from urllib import response
from django.urls import is_valid_path
from .models import actiongame, feature, gpost
from django.contrib.auth import login as dj_login , authenticate, login as real_login, login as bond_to_terms
from django.shortcuts import render
from django.contrib.auth.models import User
from .forms import ProfileUpdateForm, SignUpForm, LoginForm, UserUpdateForm, UserTermsAggrement
from django.shortcuts import redirect
from django.contrib import messages
def trials(request):
# if this is a POST request we need to process the form data
template = 'trials.html'
if request.method == 'POST':
email = request.POST.get('email')
form = SignUpForm(request.POST)
if form.is_valid():
if User.objects.filter(email=email).exists():
messages.info(request, 'Email Aready Used')
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
email = form.cleaned_data.get('email')
user = authenticate(username=username, password=raw_password, email=email)
dj_login(request,user)
return redirect('signup:terms')
else:
form = SignUpForm()
return render(request, 'trials.html', {'form': form})
form.py
from pyexpat import model
from .models import profile as ProfileModel
from dataclasses import fields
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
first_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}),help_text='*First Name is Required', required=True)
last_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}),required=False,help_text='*Optional')
date_of_birth = forms.DateField(widget=forms.DateInput(attrs={'class':'form-control'}),help_text='*Enter A Valid Date Of Birth',required=True)
email = forms.EmailField(widget=forms.EmailInput(attrs={'class':'form-control'}), required=True,help_text='*Enter Email Required', )
username = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}), required=True, help_text='*Username is Required')
password1 = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control'}))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control'}),help_text='*First password must match with the Second Password')
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
trials.html
{% block content %}
<h2>Signup</h2>
<form method="post">
{% csrf_token %}
{% for field in form %}
<p>
{{ field.label_tag }} <br>
{{ field }} <br>
{% if field.help_text %}
<p class="help_text">{{ field.help_text }}</p>
{% endif %}
{% for error in field.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</p>
{% endfor %}
<input type="submit" value="Register" class="register">
</form>
{% endblock %}
PLEASE I NEED HELP ON SOME OF THESE QUESTIONS BELOW:
How can l write that validation error in django validators.py?
Where did i made a mistake aand how to solve it

Why the NO Null constrained error keeps raising when trying to comment

I am trying to comment in a room but anytime I commented a Non NUll constrained error raised and I cannot find the problem.
The models are as follows:
class Room(models.Model):
host = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
topic = models.ForeignKey(Topic, on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=200)
description = models.TextField(null=True, blank=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-updated', '-created']
def __str__(self):
return self.name
class Message(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
body = models.TextField()
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.body[0:50]
The views is as follows:
def room(request, pk):
room = Room.objects.get(id=pk)
room_messages = room.message_set.all().order_by('-created')
if request.method == 'POST':
message = Message.objects.create(
user=request.user,
room=room,
body=request.POST.get('body')
)
return redirect('room', pk=room.id)
context = {
'room': room, 'room_messages':room_messages
}
return render(request, 'base/room.html', context)
The html:
{% if request.user.is_authenticated %}
<div class="comment-form">
<form method="POST" action="">
{% csrf_token %}
<!-- {{form}} -->
<input type="text" name="comment" placeholder="Write your message here..."/>
</form>
</div>
{% endif %}
{% endblock content %}
Thank you. I found out that in the html I've assigned "comment" instead of "body" to the name=''" in the input tag.

How Can I allow user to post a video using this models:

I want authenticated user to be able to post in this applications, How can I do that?
I tested that in sqlite admin in django and it's working fine, and now I want to allow user to post from the addvideo templates:
this is the models:
from django.db import models
from django.db.models.base import Model
from django.db.models.fields import CharField
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
file = models.FileField(null=False, blank=False)
title = CharField(max_length=25, blank=False)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
this is my addvideo templates:
<div class="container">
<div class="row justify-content-center">
<div class="col-md-5">
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="card">
<div class="form-group m-3">
<label>Upload Your Video</label><br><br>
<input required
name="video"
type="file"
accept="video/*"
class="form-control-file">
</div>
<div class="form-group m-3">
<label for="title">Your Topic</label>
<input type="text" class="form-control" name="title" id="title">
</div>
<button type="submit" class="btn btn-primary">Add Post</button>
</div>
</form>
</div>
</div>
</div>
And this is my views.py file:
from django.shortcuts import render, redirect
from django.contrib.auth.models import User, auth
from django.contrib import messages
from .models import Post
def addvideo(request):
posting = Post.objects.all()
if request.method == 'POST':
file = request.FILES.get('video')
posting = Post.objects.create(
file=file
)
return redirect('home')
return render(request, 'addvideo.html', {'posting': posting})
def dashboard(request):
posting = Post.objects.select_related('user')
return render(request, 'dashboard.html', {'posting': posting})
def home(request):
posting = Post.objects.select_related('user')
return render(request, 'home.html', {'posting': posting})
def viewVideo(request, pk):
posting = Post.objects.get(id=pk)
return render(request, 'video.html', {'posting': posting })
For me, the easiest way to solve this problem is by using CreateView.
views.py file:
from django.views.generic import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Post # Will import Your `Post` model
class PostCreateView(LoginRequiredMixin, CreateView):
model = Post
fields = ['title', 'file']
success_url = '/'
template_name = 'addvideo.html'
def form_valid(self, form):
form.instance.user = self.request.user
return super(PostCreateView, self).form_valid(form)
model is the name of your model (In your case Post).
fields are the list of fields you want to display in template.
template_name is the path to your template.
success_url is the path where the user will be redirected when the Post is created successfully.
form_valid will save the current logged-in user as the owner of the post.
addvideo.html file:
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="submit">
</form>
For using custom styles on your template, you can use django-widget-tweaks package, Here is a step-by-step tutorial on how to use this package link.

How to show choice field in template form

I want to show the Django choice field from Model on the HTML template like in the following picture. I can't see anything after doing this code.
models.py
class Author(models.Model):
TITLE_CHOICES = [
('MR', 'Mr.'),
('MRS', 'Mrs.'),
('MS', 'Ms.'),
]
title = models.CharField(max_length=3, choices=TITLE_CHOICES)
views.py
def AuthorView(request):
form = Author(request.POST or None)
title = Author.objects.all()
context = {
"form": form,
"ttile": title,
}
if form.is_valid():
form.save()
return render(request, 'index.html')
return render(request, 'index.html', context)
index.html
<select name="confirm_type" id="confirm_type">
{% for object in ttile %}
<option value="by_email"> {{ object }} </option>
{% endfor %}
</select>

Resources