widgets tutorial formularios form fields example avanzados django django-admin

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,]