2016-02-08 1 views
3

Je suis en train de faire mon champ date_modified comme caché depuis que je suis passé paramètre datetime.now sur la définition de champ date_modified dans le modèle.Comment rendre django crispy forme pour cacher un champ particulier?

model.py

class Guide(models.Model): 
    name = models.CharField(max_length=50) 
    sno = models.CharField(max_length=50) 
    date_created = models.DateTimeField(default=datetime.now, blank=True) 
    date_modified = models.DateTimeField(default=datetime.now, blank=True) 

    def __unicode__(self): 
     return unicode(self.name) 

views.py

class GuideFormUpdateView(UpdateView): 
    model = Guide 
    fields = ['name', 'sno', 'date_modified'] 
    template_name_suffix = '_update_form' 
    success_url = reverse_lazy('Guides') 

forme correspondante forms.py ressemble

<form role="form" method="POST" action="{% url 'Guideform-edit' object.pk %}" 
       class="post-form form-horizontal" enctype="multipart/form-data">{% csrf_token %} 
{{ form|crispy }} 
<button type="submit" value="Upload" class="save btn btn-default btn-primary center-block">Update</button> 

     </form> 

Ce formulaire affiche sur le terrain date_modified. Mais je ne veux pas ce champ sur le frontend à la place je veux que la valeur de ce champ dans le modèle ou db_table soit mise à jour. Je sais comment cacher ce champ particulier dans jquery mais je ne veux pas toucher ces outils js. Est-il possible de faire crispy d'exclure ce domaine particulier, comme {{ form|crispy|exclude:date_modified }} ..

+0

Permanente ou temporaire? – Pouria

+0

Je veux ce champ pour cacher uniquement sur cette forme particulière .. –

+0

« forme forms.py correspondante ressemble » est modèle .html. Je pense que vous n'avez pas forms.py car vous n'avez pas défini de formulaire personnalisé. –

Répondre

2

Au lieu d'utiliser le formulaire générique que votre UpdateView utilisera implicitement, créez votre formulaire personnalisé. Et dans votre formulaire personnalisé, changez le widget du champ date_modified.

Dans votre forms.py

from django.forms import ModelForm, HiddenInput 
class GuideForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(GuideForm, self).__init__(*args, **kwargs) 
     self.fields['date_modified'].widget = HiddenInput() 

    class Meta: 
     fields = ('name', 'sno', 'date_modified',) 
     model = models.Guide 

Dans votre views.py

class GuideFormUpdateView(UpdateView): 
    model = Guide 
    form_class = forms.GuideForm 
    template_name_suffix = '_update_form' 
    success_url = reverse_lazy('Guides') 

Pour mettre à jour automatiquement date_modified chaque fois que vous mettez à jour l'enregistrement, vous devez utiliser des attributs auto_now et auto_now_add au lieu de default. Voir Docs. Ainsi, votre modèle sera

class Guide(models.Model): 
    name = models.CharField(max_length=50) 
    sno = models.CharField(max_length=50) 
    date_created = models.DateTimeField(auto_now_add=True, blank=True) 
    date_modified = models.DateTimeField(auto_now=True, blank=True) 

    def __unicode__(self): 
     return unicode(self.name) 
+0

est que nous avons besoin Pour définir le modèle 'Guide' dans les vues et les formulaires.py? –

+0

Par définition si vous voulez dire les instructions' model = Guide' dans 'la classe' GuideForm (forms.ModelForm): 'et' class GuideFormUpdateView (UpdateView): 'alors oui dans –

+0

Tout à l'heure, j'ai remarqué que si je fais une mise à jour, mon champ 'date_modified' ne sera pas mis à jour, je dois le mettre à jour manuellement.Pensez-vous que je dois écraser la méthode POST –

2

Vous pouvez cacher un champ dans une classe de formulaire comme ceci:

Field('field_name', type="hidden") 

Field est de crispy_forms.layout

Don » t oublier que si le champ ne peut pas rester vide, vous devrez toujours passer une valeur appropriée avant de l'enregistrer.

exemple Résumé:

class GuideFormHiddenField(GuideFormUpdateView): 
    def __init__(self, *args, *kwargs): 

     Field('date_modified', type="hidden") 

Ceci est la meilleure façon. Vous pouvez bien sûr créer un formulaire entièrement nouveau, ou implémenter vos champs individuellement, et utiliser une condition pour déterminer la visibilité d'un certain champ; ce qui serait quelque chose comme if User.is_authenticated(): ....

+0

alors, je dois créer une classe Form séparée? –

+0

Vous pouvez soit faire cela, ou mettre cela dans un état; ou modifiez votre implémentation lors de la publication du formulaire, ou héritez de la classe de formulaire et ajoutez-y le code. Il existe de nombreuses façons de le faire sans créer un formulaire entièrement nouveau. L'alternative est de le cacher en utilisant JavaScript lors de l'implémentation. – Pouria

+0

Je vais ajouter un bref exemple. – Pouria

2

Je pense que cela devrait fonctionner:

from django.forms.models import modelform_factory 

class GuideFormUpdateView(UpdateView): 
    model = Guide 
    form_class = modelform_factory(Guide, widgets={"date_modified": HiddenInput }) 
    fields = ['name', 'sno', 'date_modified'] 
    template_name_suffix = '_update_form' 
    success_url = reverse_lazy('Guides') 

Voir heremodelform_factory.

+0

Merci, je vais l'utiliser si nécessaire .. –