2017-10-12 27 views
0

J'utilise Django 1.11En utilisant ModelFormMixin sans l'attribut 'champs est interdite

J'ai créé un Form et en utilisant Class based view pour créer un enregistrement et enregistrer la base de données.

Business/models.py

class BusinessType(models.Model): 
    title = models.CharField(max_length=100) 
    created = models.DateTimeField('date created', auto_now_add=True) 
    modified = models.DateTimeField('last modified', auto_now=True) 

    class Meta: 
     db_table = 'business_types' 

    def __str__(self): 
     return self.title 


class Business(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    name = models.CharField(max_length=200) 
    business_type = models.ForeignKey(BusinessType, on_delete=models.CASCADE) 
    created = models.DateTimeField('date created', auto_now_add=True) 
    modified = models.DateTimeField('last modified', auto_now=True) 

    class Meta: 
     verbose_name = 'business' 
     verbose_name_plural = 'businesses' 
     db_table = 'businesses' 

    def __str__(self): 
     return self.name 

Business/Forms.py

class BusinessForm(ModelForm): 
    class Meta: 
     model = Business 
     fields = ['user'] 

Business/views.py

class BusinessCreate(LoginRequiredMixin, CreateView): 
    model = Business 
    form = BusinessForm 

    def form_valid(self, form): 
     messages.success(self.request, 'form is valid') 
     form.instance.user = self.request.user 
     form.save() 

    def get_success_url(self): 
     messages.success(self.request, 'Business Added Successfully') 
     return reverse('business:list') 

En chargeant le modèle de BusinessCreate il donne l'erreur comme

L'utilisation de ModelFormMixin (classe de base de BusinessCreate) sans l'attribut 'fields' est interdite.

Mes essais

Après avoir déménagé fields-views class, il fonctionne très bien. Mais je ne veux pas le faire, car je peux utiliser ce formulaire sur plusieurs vues et, par conséquent, nécessitera des modifications sur plusieurs pages à l'avenir si nécessaire.

Répondre

3

Votre formulaire n'est pas reconnu. En effet, vous avez utilisé form pour définir l'attribut dans la vue, mais l'attribut correct est form_class.

(Remarque, si vous définissez correctement form_class, vous n'avez pas besoin model aussi bien.)

+0

Merci @ Daniel, j'étais coincé avec cette erreur durent une semaine –

+0

peut vous aider un peu plus comme 'def get_success_url' n'appelle pas après l'enregistrement de l'enregistrement dans la base de données. et il donne une erreur comme 'La vue business.views.BusinessCreate n'a pas retourné un objet HttpResponse. Il a retourné None à la place. ' –

+0

' get_success_url' est appelé par l'implémentation par défaut de 'form_valid', que vous avez surchargé. Vous devez retourner la redirection à partir de cette méthode, par exemple 'return redirect (self.get_success_url())'. Notez que l'appel 'messages.success' ne devrait pas vraiment être dans cette méthode. –