Как предварительно заполнить значения в полях формы, которые уже находятся в базе данных, и доставить частичную форму или принимая оставшиеся данные - PullRequest
0 голосов
/ 07 мая 2019

Я хочу создать форму, в которой запрашивается база данных, и предварительно заполнить поля, которые уже присутствовали в идентификаторе экземпляра модели или pk.

models.py

  class Uploads(models.Model):
        name = models.CharField(max_length=20,blank=True)
        age = models.IntegerField(blank=True)
        gstin = models.CharField(max_length=15,blank=False,default='xxxxxxxxxx00000')
        PAN = models.CharField(max_length=10,default="xxxxxxxxxx",blank=False)
        doc_pdf = models.FileField(upload_to='static/files',blank=True)
        image = models.ImageField(upload_to='static/images',blank=True)

        def __str__(self):
            return self.name

forms.py [мне нужно использовать super (). Clean () в методе clean ?, также работает bcoz без использования super (), зачем использовать super ()]

class Uploadform(forms.ModelForm):

   class Meta:
        model = Uploads
        fields ='__all__'

   def clean_gstin(self):
        gstin = self.cleaned_data.get('gstin')
        print(gstin)
        if len(gstin) != 15:
            raise forms.ValidationError('Input correct length of GSTIN')
        if gstin[:2].isdigit() == False:
            raise forms.ValidationError('put the 1st two digits as number')
        return gstin

   def clean_PAN(self):
       PAN = self.cleaned_data.get('PAN')
       if len(PAN) != 10:
           raise forms.ValidationError('input correct length')
       return PAN

   def clean(self):
       gst = self.cleaned_data.get('gstin')
       pan = self.cleaned_data.get('PAN')
       print(pan)
       print(gst)
       if not pan in gst:
           raise forms.ValidationError('worng GSTIN')

views.py

   def uploadview_django(request , id):
       x= Uploads.objects.all.filter(pk = id)
       if x:
          gst = x.gstin
          pan = x.pan
       if request.method == 'POST':
          form = Uploadform(request.POST , request.FILES)
          if form.is_valid():
               form.save()

               return redirect('index')
        else:

            form = Uploadform(gstin = gst , PAN = pan)

        return render(request,'form.html',{'form':form})

после предложения сделать это:

   def uploadview_django(request):
    try:
       x = Uploads.objects.all().filter(pk = 12)
    except Uploads.DoesNotExists:
       x= None

    if request.method == 'POST':
         form = Uploadform(request.POST , request.FILES , instance=x)
         if form.is_valid():
             form.save()

           return redirect('index')
     else:
         form = Uploadform(instance=x)

     return render(request,'form.html',{'form':form})

показывает ошибку:

Traceback:

Файл "C: \ Users \ J A X \ Anaconda3 \ envs \ madeenv \ lib \ site-packages \ django \ core \ handlers \ exception.py" во внутреннем каталоге 34. response = get_response (запрос)

Файл "C: \ Users \ J A X \ Anaconda3 \ envs \ madeenv \ lib \ site-packages \ django \ core \ handlers \ base.py" в _get_response 126. response = self.process_exception_by_middleware (e, request)

Файл "C: \ Users \ J A X \ Anaconda3 \ envs \ madeenv \ lib \ site-packages \ django \ core \ handlers \ base.py" в _get_response 124. response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

Файл "C: \ Users \ J A X \ Desktop \ Django \ practice \ Appone \ views.py" в uploadview_django 27. form = Uploadform (instance = x)

Файл "C: \ Users \ J A X \ Anaconda3 \ envs \ madeenv \ lib \ site-packages \ django \ forms \ models.py" в init 292. object_data = model_to_dict (экземпляр, opts.fields, opts.exclude)

Файл "C: \ Users \ J A X \ Anaconda3 \ envs \ madeenv \ lib \ site-packages \ django \ forms \ models.py" в model_to_dict 82. opts = instance._meta

Тип исключения: AttributeError at / form_django Значение исключения: у объекта 'QuerySet' нет атрибута '_meta'

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Сначала вы должны выполнить запрос, используя get x= Uploads.objects.all.get(pk = id), убедитесь, что поместили это в try, кроме блока, например,

try:
    x= Uploads.objects.get(pk = id)
except:
    x=None

Просто просто передайте экземпляр в пост формы и получите методы, как этотform = Uploadform(request.POST , request.FILES, instance=x) и form = Uploadform(instance=x).

Теперь он должен заполнить значения полей, для которых задан экземпляр.

Для примера из документов посмотрите this

0 голосов
/ 07 мая 2019

Вы должны передать instance при инициализации формы, как показано ниже

x = Uploads.objects.all.filter(pk=id)
# .... your code....
if request.method == 'POST':
    form = Uploadform(instance=x, request.POST, request.FILES)
    if form.is_valid():
        form.save()
        return redirect('index')
else:
    form = Uploadform(instance=x)
# .... your code....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...