I would like your help with a problem that I can't solve or find a solution on the internet.
I have a user registration form that was working correctly before. But feel the need to insert a dynamic formset.
However, now with the formset when filling out and sending the form, no data is saved in the database and instead of being redirected to a list of users, I am redirected to the form again already filled with the data that failed to be sent and without showing any kind of error.
models.py
class Contato(models.Model):
tipo = (
('Residencial', 'Residencial'),
('Comercial', 'Comercial'),
('Celular', 'Celular'),
('WhatsApp', 'WhatsApp'),
)
# Contato
email_p = models.EmailField(blank=True, null=True, verbose_name='E-mail pessoal')
email_c = models.EmailField(blank=True, null=True, verbose_name='E-mail corporativo')
proprietario = models.ForeignKey(Perfil, on_delete=models.CASCADE)
tipo_contato = models.CharField(verbose_name='Tipo', choices=tipo, max_length=11, blank=True, null=True)
telefone = models.CharField(max_length=16, blank=True, null=True)
def __str__(self):
return self.proprietario, self.telefone
forms.py
import datetime
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.contrib.auth.models import Group
from Cadastro.models import Local
from django.forms import NumberInput, inlineformset_factory
from Usuarios.models import Contato, Perfil
class UsuarioForm(UserCreationForm):
tipo = (
('Residencial', 'Residencial'),
('Comercial', 'Comercial'),
('Celular', 'Celular'),
('WhatsApp', 'WhatsApp'),
)
contratacao = [(
('CLT', 'CLT'),
('Estagiário', 'Estagiário'),
('Prestador de Serviço (MEI)', 'Prestador de Serviço (MEI)'),
)]
# Dados pessoais
nome_completo = forms.CharField(max_length=150)
nome_mae = forms.CharField(max_length=150, label='Nome do Mãe', required=False)
nome_pai = forms.CharField(max_length=150, label='Nome do Pai', required=False)
cpf = forms.CharField(max_length=15, label='CPF')
rg = forms.CharField(max_length=15, label='RG')
org_exped = forms.CharField(max_length=15, label='Org. Exp')
data_nasc = forms.DateField(label="Dt. de Nascimento", required=True, widget=NumberInput(attrs={'type': 'date'}))
data_emiss = forms.DateField(label="Data de Emissão", required=True, widget=NumberInput(attrs={'type': 'date'}))
# Endereço
logradouro = forms.CharField(max_length=50)
numero_casa = forms.IntegerField(max_value=9999, min_value=0, label='Número', required=False)
complemento_casa = forms.CharField(max_length=10, label='Complemento', required=False)
estado = forms.CharField(max_length=30)
bairro = forms.CharField(max_length=30)
cidade = forms.CharField(max_length=30)
cep = forms.CharField(max_length=15)
# Contato
telefone = forms.CharField(max_length=16)
email_p = forms.EmailField(max_length=100, label='E-mail pessoal')
email_c = forms.EmailField(max_length=100, label='E-mail corporativo')
tipo_contato = forms.ChoiceField(choices=tipo)
dt_cadastro = forms.DateField(label='Dt. de Cadastro', disabled=True, required=False,
widget=NumberInput(attrs={'type': 'date', 'value': datetime.date.today()}))
dt_inicio = forms.DateField(label='Dt. de Inicio', required=False, widget=NumberInput(attrs={'type': 'date'}))
# ForeignKeys
local = forms.ModelChoiceField(queryset=Local.objects.all())
grupo = forms.ModelChoiceField(queryset=Group.objects.all())
class Meta:
model = User
fields = ['username',
'nome_completo',
'rg',
'data_emiss',
'org_exped',
'cpf',
'email',
'data_nasc',
'password1',
'password2',
'grupo',
]
class ContatoForm(forms.ModelForm):
class Meta:
model = Contato
fields = '__all__'
UsuarioFormSet = inlineformset_factory(Perfil, Contato, form=ContatoForm, fields=('tipo_contato', 'telefone'), extra=1)
views.py
""" Implementando classes para o método de CREATE """
class UsuarioCreate(GroupRequiredMixin, LoginRequiredMixin, SuccessMessageMixin, CreateView):
template_name = 'Cadastro/formulario_usuario.html'
group_required = u"Adminstrador"
form_class = UsuarioForm
success_url = reverse_lazy('listar-usuario')
success_message = "Cadastrado com sucesso"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['titulo'] = 'Registro de novo usuário'
context['botao'] = 'Cadastrar'
if self.request.POST:
context['form'] = UsuarioForm(self.request.POST)
context['contato_form'] = UsuarioFormSet(self.request.POST)
else:
context['form'] = UsuarioForm()
context['contato_form'] = UsuarioFormSet()
return context
def form_valid(self, form):
group = self.request.POST.get('grupo')
grupo = get_object_or_404(Group, id=group)
self.object.groups.add(grupo)
self.object.save()
Perfil.objects.create(
usuario=self.object,
nome_completo=self.request.POST.get('nome_completo'),
cpf=self.request.POST.get('cpf'),
rg=self.request.POST.get('rg'),
org_exp=self.request.POST.get('org_exped'),
telefone=self.request.POST.get('telefone'),
local=self.request.POST.get('local'),
data_nascimento=self.request.POST.get('data_nasc'),
data_emissao=self.request.POST.get('data_emiss'),
nome_mae=self.request.POST.get('nome_mae'),
nome_pai=self.request.POST.get('nome_pai'),
tipo_contato=self.request.POST.get('tipo_contato'),
numero_casa=self.request.POST.get('numero_casa'),
Estado=self.request.POST.get('estado'),
Cidade=self.request.POST.get('cidade'),
Bairro=self.request.POST.get('bairro'),
complemento=self.request.POST.get('complemento_casa'),
dt_cadastro=self.request.POST.get('dt_cadastro'),
dt_inicio=self.request.POST.get('dt_inicio'),
email_p=self.request.POST.get('email_p'),
email_c=self.request.POST.get('email_c'),
)
context = self.get_context_data()
forms = context['form']
formset = context['contato_form']
if forms.is_valid() and formset.is_valid():
self.object = form.save()
forms.instance = self.object
formset.instance = self.object
forms.save()
formset.save()
else:
return self.render_to_response(self.get_context_data(form=form))
return super(UsuarioCreate, self).form_valid(form)
Related
`is_super is a user whose account expires after 30 days and is_super field should be false. I tried many methods, but they never false this field after the end of the time. I can't think of a way or I don't know where we made a mistake.
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin,AbstractUser
from .managers import UserManager
from datetime import datetime,timedelta
from django.utils import timezone
# Create your models here.
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=100, unique=True)
phone = models.CharField(max_length=11, unique=True)
full_name = models.CharField(max_length=200)
is_active = models.BooleanField(default= True)
is_admin = models.BooleanField(default=False)
is_super = models.BooleanField(default=False)
create_time_super_user = models.DateTimeField(auto_now=True, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True, null=True, blank=True)
objects = UserManager()
USERNAME_FIELD = 'phone'
REQUIRED_FIELDS = ['email', 'full_name']
def __str__(self):
return self.phone
#property
def is_staff(self):
return self.is_admin
# #property
def active(self):
now = timezone.now()
if self.create_time_super_user > now - timedelta(seconds=15):
self.is_super = False
self.save()
return self
def User_expire_time(self):
user_super = self.object.all()
if self.is_super:
if self.objects.filter(create_time_super_user__lte=self.timezone.now() - timedelta(day=30)):
user_super.update(is_super = False)
user_super.save
return user_super
I am new to Django and have a MultiSelectField in my Meal Model. I am also utilizing a MultipleChoiceField with widget CheckBoxSelectMultiple in my Meal Form. When I select a checkbox in the Template and POST the form, I get an error which states, "[ValidationError(["Value ['CHICKEN CASSEROLE'] is not a valid choice."])]}). I am wondering what I am doing wrong here and need some assistance in figuring this out. Any help is appreciated. Below is my code for my Model and Form:
class Meal(models.Model):
day = models.CharField(max_length=255, blank=True)
category = models.CharField(max_length=100, blank=True)
meal_time = models.TimeField(null=True, blank=True, verbose_name='Meal Time')
recipes = MultiSelectField(max_length=5000, choices=[], null=True)
meal_id = models.IntegerField(null=True, blank=True)
menu = models.ForeignKey(Menu, on_delete=models.CASCADE, null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return "%s %s %s %s" % (
self.day, self.category, self.meal_time, self.recipes)
class Meta:
app_label = "mealmenumaster"
managed = True
class MealForm(forms.ModelForm):
day = DynamicChoiceField(choices=[], required=False)
category = forms.ChoiceField(choices=(('', 'None'),) + CATEGORY, required=False)
recipes = forms.MultipleChoiceField(label="Select Recipe(s)",
widget=forms.CheckboxSelectMultiple(), required=False)
meal_id = forms.CharField(widget=forms.HiddenInput(), required=False)
class Meta:
widgets = {'meal_time': TimeInput()}
model = Meal
fields = ['day', 'category', 'meal_time', 'recipes', 'meal_id']
app_label = "mealmenumaster"
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user_id', None)
super(MealForm, self).__init__(*args, **kwargs)
self.fields['recipes'].choices = [(x.name, x.name) for x in Recipe.objects.filter(user_id=user_id).order_by(Lower('name'))]
self.fields['meal_id'].initial = "0"
self.helper_meal = FormHelper()
self.helper_meal.form_tag = False
self.helper_meal.layout = Layout(
Row(
Div(
Field('day', css_class='form-control'),
css_class='form-group col-md-3 mb0'),
Div(
Field('category', css_class='form-control'),
css_class='form-group col-md-4 mb0'),
Div(
Field('meal_time', css_class='form-control'),
css_class='form-group col-md-4 mb0'),
css_class='form-group col-md-12 mb0'
),
Row(
Div(
Field('recipes', css_class="scrollbar-y"),
Field('meal_id', id='meal_id'),
css_class='form-group col-md-8 mb0'),
css_class='form-group row-md-10 mb0'),
)
And part of my View:
current_user = request.user
user_id = current_user.id
meal_form = MealForm(request.POST, user_id=request.user.id)
if meal_form.is_valid():
menu_id = request.POST.get('menu_id')
if menu_id == "":
messages.error(request, "Create and Save Menu Before Adding Meal(s)")
return redirect('menu')
else:
meal_id = meal_form.cleaned_data['meal_id']
category = meal_form.cleaned_data['category']
meal_time = meal_form.cleaned_data['meal_time']
recipes = meal_form.cleaned_data['recipes']
# get recipes for recipe id
if len(recipes) == 1:
recipes_list = recipes[0]
else:
recipes_list = ', '.join(recipes)
try:
existing_meal = Meal.objects.get(id=int(meal_id))
meal_form = MealForm(request.POST, instance=existing_meal)
# update meal object
saved_meal = meal_form.save(commit=False)
saved_meal.category = category
saved_meal.meal_time = meal_time
saved_meal.recipes = recipes_list
saved_meal.save()
messages.success(request, "Meal Updated")
return HttpResponseRedirect(reverse('menu', args=(),
kwargs={'menu_id': menu_id}))
except Meal.DoesNotExist:
# create new meal object
new_meal = meal_form.save(commit=False)
# set user foreign key
new_meal.user_id = user_id
new_meal.menu_id = int(menu_id)
# save meal
new_meal.save()
new_meal.meal_id = new_meal.id
new_meal.recipes = recipes_list
new_meal.save()
messages.success(request, "Meal Added")
return HttpResponseRedirect(reverse('menu', args=(),
kwargs={'menu_id': menu_id}))
else:
error = meal_form.errors.as_data()
message = "Form Error:", error
messages.error(request, message)
return render_forms(request)
I was able to resolve this issue by adding the actual choices to the model field. As shown below:
RECIPES = [(x.pk, x.name) for x in Recipe.objects.filter().order_by(Lower('name'))] added as choices in the models for the multi-select field "recipes"
I have a Django web application in which I would like to integrate a local payment API in order to enable customers who want to use their money from this payment application to pay their car insurance but honestly, I don't have any idea of how to do it.
Below are the related models (Contrat and Reglement):
class Contrat(models.Model):
Statut_contrat = (
('Encours', 'Encours'),
('Suspendu', 'Suspendu'),
('Expiré', 'Expiré'),
)
categorie_choices =(
('Tourisme', 'Tourisme'),
('Transport', 'Transport')
)
# numero_de_contrat = shortuuid.uuid()
type_contrat = models.ForeignKey(TypeContrat, on_delete=models.CASCADE, null=True, blank=False)
tca = models.DecimalField(_('TCA 4%'),max_digits=10, decimal_places=2, default=0.00)
numero_de_contrat = models.CharField(max_length=50, blank=True, null=True,db_index=True, unique=True)
statut_assurance =models.CharField(max_length=15, choices=Statut_contrat, default='Non')
vehicule = models.ForeignKey(Vehicule, on_delete=models.CASCADE)
utilisateur = models.ForeignKey(User, on_delete=models.CASCADE)
nombre_de_mois = models.IntegerField(null=True, blank=True)
sous_couvert = models.CharField(_('S/C'),max_length=200, null=True, blank=True)
categorie = models.CharField(max_length=50, choices=categorie_choices, null=False, blank=False, default='Tourisme')
created = models.DateField(auto_now_add=True)
modified = models.DateField(auto_now=True)
active = models.BooleanField(default=True)
remainingdays=models.IntegerField(default=0)
blocked_date=models.DateField()
unblocked_date = models.DateField(null=True, blank=True)
history = HistoricalRecords()
class Meta:
ordering=('-created',)
#property
def static_id(self):
'C{0:07d}'.format(self.pk)
def __str__(self):
return str(self.numero_de_contrat)
def save(self, *args, **kwargs):
self.tca=self.type_contrat.montant_du_contrat*Decimal(0.04)
if self.statut_assurance=="Suspendu":
dt=abs(self.blocked_date-self.modified)
print('Difference est:',dt)
numberOfDaysLeft= self.remainingdays-dt.days
print('Big diff',numberOfDaysLeft)
self.remainingdays=numberOfDaysLeft
self.blocked_date=date.today()
super(Contrat, self).save(*args, **kwargs)
def activeStatus(self):
if self.nombre_de_mois==0:
return self.active==False
else:
return self.active==True
def get_NbDays(self):
if self.statut_assurance=='Encours':
# nb_Days = timedelta(days=self.remainingdays)+date.today()
nb_Days = timedelta(days=self.remainingdays)+self.blocked_date
print('Date de fin', nb_Days)
return nb_Days
elif self.statut_assurance=='Suspendu':
nb_Days = timedelta(days=self.remainingdays) + self.blocked_date
return nb_Days
else:
nb_Days = self.modified
return nb_Days
class Reglement(models.Model):
payment_list = (('Espece', 'Espece'),
('Cheque', 'Cheque'),
('Carte de crédit', 'Carte de crédit'),
('Carte de débit', 'Carte de débit'),
('A crédit', 'A crédit'),)
code_reglement = models.CharField(max_length=50, blank=True, null=True, db_index=True, unique=True)
contrat = models.ForeignKey(Contrat, on_delete=models.CASCADE)
utilisateur = models.ForeignKey(User, on_delete=models.CASCADE)
date_reglement = models.DateField(auto_now_add=True)
montant_a_regler = models.DecimalField(max_digits=10, decimal_places=2)
mode_de_paiment = models.CharField(max_length=15,choices=payment_list)
created = models.DateField(auto_now_add=True)
modified = models.DateField(auto_now=True)
regle = models.BooleanField(default=False)
history = HistoricalRecords()
class Meta:
ordering=('-created',)
#property
def static_id(self):
'R{0:07d}'.format(self.pk)
Please assist me
I'm trying to save the last IP of User to the Profile module in Django but I get always NOT NULL constraint failed I know that last_ip should be set tonull=True and I run this commands:py .\manage.py makemigrations and py .\manage.py migrate. if you have any suggestions to save IP to the user that will be helpful for me.
Thanks in advance.
#models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(blank=True, max_length=150)
last_ip = models.GenericIPAddressField(null=True, blank=True)
avatar = ContentTypeRestrictedFileField(max_upload_size=10485760, null=True, verbose_name="",default='default.jpg', blank= True, content_types=['image/png', 'image/jpeg'])
def __str__(self):
return self.user.username
#forms.py
class UpdateUserForm(forms.ModelForm):
username = forms.CharField(max_length=150, required=True)
first_name = forms.CharField(max_length=150, required=False)
last_name = forms.CharField(max_length=150, required=False)
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ['username','first_name','last_name','email']
class UpdateAvatarBio(forms.ModelForm):
avatar = forms.ImageField()
bio = forms.CharField()
class Meta:
model = Profile
fields = ['avatar', 'last_ip', 'bio']
#views.py
def ip_client(request):
return (
x_forwarded_for.split(',')[0]
if (x_forwarded_for := request.META.get('HTTP_X_FORWARDED_FOR'))
else request.META.get('REMOTE_ADDR')
)
def profile(request):
ip = ip_client(request)
model = Profile(last_ip=ip)
model.save() # Traceback suppose here is the issue
if request.method == 'POST':
...
...
return render(request, 'profile.html', {'user_form': user_form, 'profile_form': profile_form})
You didn't add the user to Profile before saving it
def profile(request):
ip = ip_client(request)
model = Profile(last_ip=ip)
moddl.user=request.user #Add this
model.save() # Traceback suppose here is the issue
if request.method == 'POST':
...
...
return render(request, 'profile.html', {'user_form': user_form, 'profile_form': profile_form})
Edit:
Since the user is OneToOne (which means it is a the primary key), so Your code shall be like this
def profile(request):
ip = ip_client(request)
profile = Profile.objects.get(user=request.user)
profile.last_ip = ip
profile.save()
if request.method == 'POST':
...
...
return render(request, 'profile.html', {'user_form': user_form, 'profile_form': profile_form})
I have three models that are related to each other, namely:
models.py
class Shop(models.Model):
number = models.PositiveSmallIntegerField()
name = models.CharField(db_index=True)
city = models.ForeignKey(ShopCity, on_delete=models.CASCADE)
class Product(models.Model):
name = models.CharField(db_index=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
class ProductQuantity(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
quantity = models.PositiveSmallIntegerField(default=None)
In the admin panel they are linked in this way:
admin.py
class ProductQuantityInline(admin.TabularInline):
model = ProductQuantity
extra = 0
#admin.register(Product)
class ProductAdmin(ImportExportActionModelAdmin):
fields = ['name', 'price']
list_display = ['name', 'price']
inlines = [ProductQuantityInline]
There is a need to overwrite data with REST API
serializers.py
class QuantitySerializer(serializers.ModelSerializer):
class Meta:
model = ProductQuantity
fields = ('shop', 'quantity')
class ProductSerializer(serializers.ModelSerializer):
productquantity = serializers.SerializerMethodField(read_only=False)
class Meta:
model = Product
fields = ('name', 'price', 'productquantity')
def get_productquantity(self, obj):
return [QuantitySerializer(s).data for s in obj.productquantity_set.all()]
And finally my handler for REST API:
views.py
#api_view(['GET', 'PATCH', 'PUT', 'DELETE'])
def api_product_detail(request, pk):
product = Product.objects.get(pk=pk)
if request.method == 'GET':
serializer = ProductSerializer(product)
return Response(serializer.data)
elif request.method == 'PUT' or request.method == 'PATCH':
serializer = ProductSerializer(product, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
product.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
As a result, data such as the name and price are overwritten, and the productquantity is not overwritten.
What am I doing wrong? Thanks for any help.