J'ai deux modèles, un MainModel et un InlineModel en rapport que je voudrais afficher en ligne dans l'admin. Ce InlineModel peut être utilisé pour, disons, prendre des notes sur le modèle et doit suivre les modifications effectuées par l'utilisateur admin connecté. Bien que cela semble simple (et en effet, les docs montrent un exemple pour ceci quand le champ d'utilisateur fait partie du MainModel), je ne peux pas sembler le saisir quand le champ est sur le Inline.Django InlineModelAdmin - définir le champ inline à partir de la demande lors de la sauvegarde (définir le champ utilisateur automatiquement) (save_formset vs save_model)
Pour être plus précis, mon objectif est:
- modifications utilisateur MainModel
- utilisateur ajoute un InlineModel, ne remplissant pas dans le champ utilisateur
- presses Permet d'enregistrer code
- remplit dans le domaine de l'utilisateur pour les instances InlineModel nouvellement créées
- (Le champ utilisateur Bonus est en lecture seule pour les instances existantes et masqué pour les nouvelles entités)
Et mes questions:
- Est-ce exact? Son trop bas save_model n'est pas appelé pour les instances InlineModelAdmin
- Est-ce que cela permet de sauvegarder sans provoquer d'erreur? (l'utilisateur est requis, la validation le signale)
- Comment puis-je masquer le champ de saisie de l'utilisateur pour de nouvelles inlines, et le garder en lecture seule pour les inlines existants?
Voici mes idées actuelles:
#models.py
class MainModel(models.Model):
some_info = models.IntegerField()
class InlineModel(models.Model):
main = models.ForeignKey(MainModel)
data = models.CharField(max_length=255)
user = models.ForeignKey('auth.User')
#admin.py
class InlineModelInline(admin.TabularInline):
model = InlineModel
fields = ('data', 'user')
#readonly_fields = ('data', 'user') #Bonus question later
class MainModelAdmin(admin.ModelAdmin):
list_display = ('id', 'some_info')
inlines = [InlineModelInline]
#def save_model(self, request, obj, form, change):
#http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
#Only called for MainModel, not for any of the inlines
#Otherwise, would be ideal
def save_formset(self, request, form, formset, change):
#http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset
#Experimenting showd this is called once per formset (where the formset is a group of inlines)
#See code block at http://code.djangoproject.com/browser/django/tags/releases/1.2.1/django/contrib/admin/options.py#L894
if not isinstance(formset.model, InlineModel):
return super(MainModelAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if not instance.pk:
instance.user = request.user
instance.save()
formset.save_m2m()
Une note à moi-même, ce save_formset est une méthode de la admin.ModelAdmin, et il traitera tous les enfants Inlines attribué dans le ModelAdmin – monkut
Merci pour vos questions/réponses ici En ce qui concerne la fonctionnalité 'bonus' - après avoir marqué l'utilisateur foreignKey dans le modèle django avec editable = False, le formset en ligne a passé la validation, le champ utilisateur était encore défini et tout était kasher. user = models.ForeignKey (Utilisateur, modifiable = Faux) – sdailey
Hm, totalement oublié editable = Faux dans le modèle. tch, merci. –