Hola a todos
Tengo un modelo de usuarios extendido mediante 'AbstractUser':
models.py
Código Python:
Ver originalfrom django.db import models
from django.contrib.auth.models import AbstractUser
class Profiles(AbstractUser):
url = models.URLField()
avatar = models.ImageField(upload_to='profile_avatar')
Tengo también un formulario para modificar los usuarios basado en 'UserChangeForm':
forms.py
Código Python:
Ver originalfrom django import forms
from django.contrib.auth.forms import UserChangeForm
from django.utils.translation import ugettext as _
from .models import Profiles
class UserEditForm(UserChangeForm):
class Meta:
model = Profiles
fields = ('username', 'first_name', 'last_name', 'email', 'url',
'avatar',)
exclude = ('password',)
def clean_username(self):
username = self.cleaned_data['username']
try:
Profiles.objects.get(username=username)
except Profiles.DoesNotExist:
return username
raise forms.ValidationError(_('Duplicate username'))
def clean_avatar(self):
avatar = self.cleaned_data['avatar']
if avatar:
if avatar._size > 1024 * 1024:
raise forms.ValidationError(_('Image file too large ( > 1mb )'))
return avatar
else:
raise forms.ValidationError(_("Couldn't read uploaded image"))
def clean_password(self):
return ""
El formulario lo ejecuto mediante esta vista:
views.py
Código Python:
Ver originalfrom django.views.generic import UpdateView
from .models import Profiles
from .forms import UserEditForm
class UserEdit(UpdateView):
model = Profiles
form_class = UserEditForm
success_url = reverse_lazy('profile')
template_name = 'profile/edit.html'
def get_object(self, queryset=None):
return self.request.user
El formulario de modificación funciona correctamente en la aplicación, pero tengo dos problemas:
El primero es que el formulario requiere que el usuario inserte obligatoriamente los campos adicionales (los de mi modelo extendido) para poder enviar el formulario.
Lo he solucionado redefiniendo los campos dentro del formulario junto con el atributo "required=False" pero me gustaría saber si hay algún método de aplicar ésto a todos los campos sin tener que modificarlos uno a uno.
El segundo problema, y el más importante, es que los campos que el usuario no rellene en el formulario, en vez de ignorarlos, elimina su valor anterior.
Una posible solución es generar el valor de las etiquetas dinámicamente mediante:
Pero en caso de eliminar el valor de un campo volveríamos al mismo problema.
Un saludo, Gracias