2012-06-05 2 views
0

J'ai cherché toute la nuit une réponse à cette question, mais je n'arrive pas à trouver ce qui ne va pas.Django Ajout d'un champ à un modèle - champ ne figurant pas sur le formulaire

Je travaille sur le portage de coutume CMS à Django, et fondamentalement, il a la structure suivante:

  • Une entrée a 1 mise en page
  • Une mise en page a de nombreuses sections

Ainsi, après l'utilisateur crée et entrée, quand ils l'éditent, je veux montrer toutes les sections qui sont incluses dans cette mise en page. Donc, je reçois l'ID de mise en page à partir de l'entrée, passant en boucle et obtenant les sections, et essayant de les ajouter au formulaire.

Quand je debug, il semble que tout est ajouté aux champs objet très bien, mais il ne montre pas sur la forme à moins que je prédéfinir les champs, ce qui irait à l'encontre du but

Je suivi plusieurs exemples ici et ont obtenu à ce code:

class EntryChangeForm(forms.ModelForm): 

def __init__(self, *args, **kwargs): 
    super(EntryChangeForm, self).__init__(*args, **kwargs) 
    layout = Layout.objects.filter(id=self.instance.layout_id) 
    layout_sections = Section.objects.filter(layout_id=layout) 
    for section in layout_sections: 
     self.fields['section_%d' % section.id] = models.CharField(max_length=200, verbose_name=section.section_label) 
     current_section = Data.objects.filter(page_id=self.instance.id, section_id=section.id, content_table_id=2) 
     if current_section: 
      self.fields['section_%d' % section.id.initla] = current_section.text 
     else: 
      self.fields['section_%d' % section.id].initial = "" 

Un exemple quand je débogage et impression self.fields

{'layout': 
<django.forms.models.ModelChoiceField object at 0x1c30b50>, 
'uid': <django.forms.fields.IntegerField object at 0x1c30c50>, 
'url': <django.forms.fields.CharField object at 0x1c30cd0>, 
'url_301': <django.forms.fields.CharField object at 0x1c30d50>, 
'name': <django.forms.fields.CharField object at 0x1c30dd0>, 
'page_title': <django.forms.fields.CharField object at 0x1c30e50>, 
'meta_description': 
<django.forms.fields.CharField object at 0x1c30ed0>, 
'meta_keywords': <django.forms.fields.CharField object at 0x1c30f50>, 
'order_fld': <django.forms.fields.CharField object at 0x1c30fd0>, 
'user_id': <django.forms.fields.IntegerField object at 0x1c32090>, 
'author': <django.forms.models.ModelChoiceField object at 0x1c32110>, 
'date_active': <django.forms.fields.SplitDateTimeField object at 0x1c32210>, 
'date_added': <django.forms.fields.SplitDateTimeField object at 0x1c32290>, 'date_modified': <django.forms.fields.SplitDateTimeField object at 0x1c32390>, 'date_expires': <django.forms.fields.SplitDateTimeField object at 0x1c32490>, 'date_published': <django.forms.fields.SplitDateTimeField object at 0x1c32590>, 'is_active': <django.forms.fields.TypedChoiceField object at 0x1c32690>, 'hide_from_dropdown': <django.forms.fields.TypedChoiceField object at 0x1c32790>, 'is_featured': 
<django.forms.fields.TypedChoiceField object at 0x1c32810>, 
'in_sitemap': <django.forms.fields.TypedChoiceField object at 0x1c32890>, 
'admin_user_id': <django.forms.fields.IntegerField object at 0x1c32910>, 'show_large_photo': <django.forms.fields.TypedChoiceField object at 0x1c32990>, 'is_featured_on_homepage': <django.forms.fields.TypedChoiceField object at 0x1c32a10>, 'capitalize_first_letter': <django.forms.fields.TypedChoiceField object at 0x1c32a90>, 'display_share_box': <django.forms.fields.TypedChoiceField object at 0x1c32b10>, 'display_subscribe_box': <django.forms.fields.TypedChoiceField object at 0x1c32b90>, 'is_commenting_enabled': <django.forms.fields.TypedChoiceField object at 0x1c32c10>, 'legacy_import': 
<django.forms.fields.TypedChoiceField object at 0x1c32c90>, 
'section': <django.db.models.fields.CharField>, 
'section_3': <django.db.models.fields.CharField>, 
'section_2': <django.db.models.fields.CharField>, 
'section_4': <django.db.models.fields.CharField>} 


{'layout': 
<django.forms.models.ModelChoiceField object at 0x1c30b50>, 
'uid': <django.forms.fields.IntegerField object at 0x1c30c50>, 
'url': <django.forms.fields.CharField object at 0x1c30cd0>, 
'url_301': <django.forms.fields.CharField object at 0x1c30d50>, 
'name': <django.forms.fields.CharField object at 0x1c30dd0>, 
'page_title': <django.forms.fields.CharField object at 0x1c30e50>, 
'meta_description': <django.forms.fields.CharField object at 0x1c30ed0>, 
'meta_keywords': <django.forms.fields.CharField object at 0x1c30f50>, 
'order_fld': <django.forms.fields.CharField object at 0x1c30fd0>, 
'user_id': <django.forms.fields.IntegerField object at 0x1c32090>, 
'author': <django.forms.models.ModelChoiceField object at 0x1c32110>, 
'date_active': <django.forms.fields.SplitDateTimeField object at 0x1c32210>, 
'date_added': <django.forms.fields.SplitDateTimeField object at 0x1c32290>, 'date_modified': <django.forms.fields.SplitDateTimeField object at 0x1c32390>, 'date_expires': <django.forms.fields.SplitDateTimeField object at 0x1c32490>, 'date_published': <django.forms.fields.SplitDateTimeField object at 0x1c32590>, 'is_active': <django.forms.fields.TypedChoiceField object at 0x1c32690>, 'hide_from_dropdown': <django.forms.fields.TypedChoiceField object at 0x1c32790>, 'is_featured': <django.forms.fields.TypedChoiceField object at 0x1c32810>, 
'in_sitemap': <django.forms.fields.TypedChoiceField object at 0x1c32890>, 
'admin_user_id': <django.forms.fields.IntegerField object at 0x1c32910>, 'show_large_photo': <django.forms.fields.TypedChoiceField object at 0x1c32990>, 'is_featured_on_homepage': <django.forms.fields.TypedChoiceField object at 0x1c32a10>, 'capitalize_first_letter': <django.forms.fields.TypedChoiceField object at 0x1c32a90>, 'display_share_box': <django.forms.fields.TypedChoiceField object at 0x1c32b10>, 'display_subscribe_box': <django.forms.fields.TypedChoiceField object at 0x1c32b90>, 'is_commenting_enabled': <django.forms.fields.TypedChoiceField object at 0x1c32c10>, 'legacy_import': <django.forms.fields.TypedChoiceField object at 0x1c32c90>, 
'section': <django.db.models.fields.CharField>, 
'section_3': <django.db.models.fields.CharField>, 
'section_2': <django.db.models.fields.CharField>, 
'section_4': <django.db.models.fields.CharField>} 

Je peux voir les obvi ous différence dans les champs que j'ai ajoutés vs les champs qui étaient déjà dans le modèle: 'legacy_import': <django.forms.fields.TypedChoiceField object at 0x1c32c90>, 'section': <django.db.models.fields.CharField>, mais je ne sais pas comment corriger cela.

+0

didi u ajouté ce champ dans votre base de données manuellement ....... ..? – user1409289

+0

Le champ est dans la base de données, mais il n'est pas dans ce modèle. C'est dans un autre modèle. – Jimmy

+0

Je devrai aussi écrire des fonctions d'enregistrement personnalisées, mais j'ai besoin d'avoir ces informations supplémentaires sur le formulaire – Jimmy

Répondre

1

a trouvé la réponse.

https://code.djangoproject.com/ticket/12238

Apparemment, il y a un bug avec l'ajout de champs à ModelForms.

L'application de la modification trouvée dans les commentaires du lien ci-dessus à options.py semble avoir corrigé le problème et les champs apparaissent maintenant sur le formulaire.

J'ai résolu ce problème en attendant la mise à jour par contrib/admin/options.py dans:

def get_fieldsets(self, request, obj=None): 
    "Hook for specifying fieldsets for the add form." 
    if self.declared_fieldsets: 
     return self.declared_fieldsets 
    #form = self.get_form(request, obj) 
    #return [(None, {'fields': form.base_fields.keys()})] 
    form = self.get_form(request, obj)(instance=obj) 
    return [(None, {'fields': form.fields.keys()})] 
0

chances pourrait être si vous ne définissez pas la clé primaire dans votre modèle puis colonne ID nommé ou quelque chose en fonction de votre environnement django paramètre sera créé automatiquement comme clé primaire. ou cela pourrait être le cas si vous définissiez directement des colonnes dans db mais pour ce faire, vous devez écrire leur mapping dans le modèle django. pour voir votre sql modèle juste aller à la borne et le type:

# python manage.py sql [appname] 

Maintenant, il y aura table SQL généré par django pour vous. Donc, vous pouvez voir des colonnes.

+0

Utilisé manage.py pour créer les tables. La boucle qui obtient toutes les données supplémentaires fonctionne bien, quand je débogue, je peux voir les sections qu'il saisit et ajoute à l'objet self.fields. Ne s'affiche pas lorsque le formulaire est rendu. – Jimmy

2

Ceci est une forme, pas un modèle, donc vous voulez ajouter des champs de formulaire, pas des champs de modèle.

self.fields['section_%d' % section.id] = forms.CharField(max_length=200, label=section.section_label) 
+0

J'ai essayé cela en premier. Je l'avais changé en modèle juste parce que je pensais qu'il pourrait avoir besoin d'être le même type que ceux déjà ajoutés. – Jimmy

+0

Il suffit de revenir en arrière et le même résultat, ne pas apparaître sur le formulaire, ne pas d'erreur, le débogage montre qu'il est ajouté tout simplement pas sur le formulaire – Jimmy

Questions connexes