ModelForm получил неожиданный аргумент «начальный» - PullRequest
0 голосов
/ 13 марта 2020

modelForm получил неожиданный аргумент 'initial' Я получаю эту ошибку. пожалуйста, кто-нибудь может объяснить, как решить эту проблему? Вот мой model.py

class Profile(models.Model):
      user = models.OneToOneField(User, on_delete=models.CASCADE, default=None)
      StudentID = models.CharField(max_length=8, blank=False, unique=True)
      Branch = models.CharField(max_length=255,choices=Departments,default="CSE")

     def __str__(self):
          return f'{self.user.username} Profile'

class complaintForm(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE)
    category = models.CharField(max_length=255,choices=complaints,default='Mess')
    title = models.CharField(max_length=20)
    content = models.CharField(max_length=100)
    image = models.ImageField(upload_to='complaint_pics/')


   def __str__(self):
       return self.title

form.py

class complaintForm(forms.ModelForm):
    class Meta:
        model = complaintForm
        fields = ['title','content','image',]

views.py

class CreateComplaintView(CreateView):
    model = complaintForm
    form_class = complaintForm
    template_name = 'user/post_complaint.html'
    success_url = 'success'

1 Ответ

1 голос
/ 13 марта 2020

Вы передали свою модель атрибуту form. Вот почему ComplaintForm не очень хорошая идея для названия модели. Лучше переименуйте его в Complaint, например:

class <b>Complaint</b>(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE)
    category = models.CharField(max_length=255,choices=complaints,default='Mess')
    title = models.CharField(max_length=20)
    content = models.CharField(max_length=100)
    image = models.ImageField(upload_to='complaint_pics/')


   def __str__(self):
       return self.title

. Вам нужно будет создать и запустить миграцию, чтобы переименовать таблицу на стороне базы данных.

Тогда вы определите свою форму как :

from app.models import <b>Complaint</b>

class ComplaintForm(forms.ModelForm):
    class Meta:
        model = <b>Complaint</b>
        fields = ['title','content','image',]

Наконец, в вашем CreateView вы можете использовать:

from app.models import Complaint
from app.forms import ComplaintForm

class CreateComplaintView(CreateView):
    model = <b>Complaint</b>
    form_class = <b>ComplaintForm</b>
    template_name = 'user/post_complaint.html'
    success_url = 'success'

    def form_valid(self, form):
        form.instance.user = self.request.user.profile
        super().form_valid(form)

Примечание : обычно это Django модели, совсем как всем классам в Python присваивается имя в PerlCase , а не snake_case , поэтому оно должно быть: Complaint вместо complaint.

...