tutorial - formularios avanzados django
Administrador de Django: hace que el campo sea editable en agregar pero no editar (3)
Tengo un modelo similar a esto:
class Product(models.Model):
third_party_id = models.CharField(max_length=64, blank=False, unique=True)
que usa la clave primaria predeterminada de Django. Deseo que los usuarios puedan agregar productos estableciendo el third_party_id en la página de agregar, pero no quiero que ese campo se pueda editar en la página de edición para evitar dañar el third_party_id. En los documentos de Django, parece que se usan las mismas configuraciones para agregar y editar. es posible?
Lo anterior es útil (la respuesta de shanyu es get_readonly_fields), sin embargo, no funciona correctamente si se usa en "StackedInline". El resultado es dos copias de cualquier campo marcado como de solo lectura, y no se puede editar en la instancia de "agregar". Mira este error: https://code.djangoproject.com/ticket/15602
Espero que esto le ahorre a alguien un poco de búsqueda!
No configure self.readonly_fields
para evitar problemas con el hilo. En su lugar, anule el método get_readonly_fields:
def get_readonly_fields(self, request, obj=None):
if obj: # obj is not None, so this is an edit
return [''third_party_id'',] # Return a list or tuple of readonly fields'' names
else: # This is an addition
return []
No estoy seguro de si esta es la mejor manera, pero podría definir su propio formulario para el administrador. Y personalizado valide su third_party_id, rechazando si ya está configurado:
Admin.py
class ProductAdminForm(forms.ModelForm):
class Meta:
model = Product
def clean_third_party_id(self):
cleaned_data = self.cleaned_data
third_party_id = cleaned_data[''third_party_id'']
id = cleaned_data[''id'']
obj = Product.objects.get(id=id)
if obj.third_party_id != third_party_id:
raise ValidationError("You cannot edit third_party_id, it must stay as %s" % obj.third_party_id)
return third_party_id
class ProductAdmin(admin.Admin):
form = [ProductAdminForm,]