django форма не смогла получить значения из запроса - PullRequest
0 голосов
/ 06 февраля 2020

это views.py

def registerItem(request):
    print(request)
    try:
        print("====111", request.method)
        if request.method == 'POST':
            print("=========222", request.POST)
            form = ItemForm(request.POST)
            print("====333", form.is_bound)
            print("====444", form)
            print("====555", form.cleaned_data['mart_id']())
            print("====666", form.is_valid())
            if form.is_valid():
                mart = MartModel.objects.get(id__exact=form.cleaned_data['mart_id'])
                print("====666", mart)
                seq = ItemModel.objects.filter(mart_id__exact=mart).values('seq').order_by('-seq')[:1]
                if seq:
                    seq = seq[0]['seq']+1
                else:
                    seq = 1
                # form.save()
                item = ItemModel(mart_id=mart, seq=seq, name=form.cleaned_data['name'], price=form.cleaned_data['price'], expirationDate=form.cleaned_data['expirationDate'], stockYn=form.cleaned_data['stockYn'])
                item.save()
                form = ItemForm()
                return render(request, 'mobileWeb/admin/register_item.html', {'form':form})
        else:
            form = ItemForm()
            return render(request, 'mobileWeb/admin/register_item.html', {'form':form})
    except Exception as ex:
        print('====777 : Error occured : ', ex)

request.POST значение правильное. Вы можете подтвердить это в журнале № 2. форма связана правильно. Вы можете подтвердить это в журнале № 3. но форма не смогла получить значения. Вы можете подтвердить это в журнале № 4.

enter image description here

это Forms.py

class MartForm(forms.ModelForm):
    class Meta:
        model = MartModel
        fields = ['name', 'address', 'tell', 'phone', 'xPosition', 'yPosition']

class ItemForm(forms.ModelForm):
    choicesQueryset = MartModel.objects.all().values('id', 'name')
    choicesDic = []
    for choice in choicesQueryset:
        choicesDic.append((choice['id'], choice['name']))
    mart_id = forms.CharField(label='mart', widget=forms.Select(choices=choicesDic))
    class Meta:
        model = ItemModel
        fields = ['mart_id', 'name', 'price', 'expirationDate', 'stockYn']

Это models.py

class MartModel(models.Model):
    name = models.CharField(max_length=20, blank=False)
    address = models.TextField(blank=False)
    tell = models.CharField(blank=True, max_length=12)
    phone = models.CharField(blank=True, max_length=11)
    imageFileNo = models.CharField(blank=True, max_length=3)
    xPosition = models.FloatField(blank=False)
    yPosition = models.FloatField(blank=False)
    delete_yn = models.CharField(blank=False, default="N", max_length=1)
    ins_dttm = models.DateTimeField(blank=False, auto_now_add=True)
    ins_user = models.CharField(blank=False, max_length=20, default='ADMIN')
    upt_dttm = models.DateTimeField(blank=False, auto_now=True)
    upt_user = models.CharField(blank=False, max_length=20, default='ADMIN')

class ItemModel(models.Model):
    mart_id = models.ForeignKey('martModel', models.DO_NOTHING)
    seq = models.IntegerField(blank=False)
    name = models.CharField(blank=False, max_length=20)
    price = models.IntegerField(blank=False)
    expirationDate = models.DateField(blank=False)
    stockYn = models.CharField(blank=False, max_length=1, default='Y')
    delete_yn = models.CharField(blank=False, default="N", max_length=1)
    ins_dttm = models.DateTimeField(blank=False, auto_now_add=True)
    ins_user = models.CharField(blank=False, max_length=20, default='ADMIN')
    upt_dttm = models.DateTimeField(blank=False, auto_now=True)
    upt_user = models.CharField(blank=False, max_length=20, default='ADMIN')

    class Meta:
        unique_together = (
            ('mart_id', 'seq')
        )

Я знаю, что это должен быть экземпляр, а не значение при работе с foreignKey. но ошибка произошла во время привязки. Это спор с ForeignKey ??

================ после совета

enter image description here

здесь нет имени магазина.

это Forms.py

class ItemForm(forms.ModelForm):
    mart = forms.ModelChoiceField(queryset=MartModel.objects.all(), to_field_name='name')
    class Meta:
        model = ItemModel
        fields = ['mart', 'name', 'price', 'expirationDate', 'stockYn']

Это views.py

from django.shortcuts import render
from .forms import *

# Create your views here.

def index(request):
    try:
        marts = MartModel.objects.all().values('id', 'name', 'imageFileNo', 'xPosition', 'yPosition')
        items = ItemModel.objects.filter(stockYn__exact='Y').values('mart', 'name', 'price', 'expirationDate').order_by('mart_id', 'seq')

        return render(request, 'mobileWeb/index/index.html', {'marts':marts, 'items':items})
    except Exception as ex:
        print('Error occured : ', ex)

def registerMart(request):
    try:
        if request.method == 'POST' :
            form = MartForm(request.POST)
            if form.is_valid():
                form.save()
                return render(request, 'mobileWeb/index/index.html')
        else :
            form = MartForm()
            return render(request, 'mobileWeb/admin/register_mart.html', {'form':form})
    except Exception as ex:
        print('Error occured : ', ex)

def registerItem(request):
    print(request)
    try:
        print("====111", request.method)
        if request.method == 'POST':
            print("=========222", request.POST)
            form = ItemForm(request.POST)
            print("====333", form.is_bound)
            print("====444", form)
            if form.is_valid():
                mart = MartModel.objects.get(id__exact=form.cleaned_data['mart'])
                print("====666", mart)
                seq = ItemModel.objects.filter(mart__exact=mart).values('seq').order_by('-seq')[:1]
                if seq:
                    seq = seq[0]['seq']+1
                else:
                    seq = 1
                # form.save()
                item = ItemModel(mart=mart, seq=seq, name=form.cleaned_data['name'], price=form.cleaned_data['price'], expirationDate=form.cleaned_data['expirationDate'], stockYn=form.cleaned_data['stockYn'])
                item.save()
                form = ItemForm()
                return render(request, 'mobileWeb/admin/register_item.html', {'form':form})
        else:
            form = ItemForm()
            return render(request, 'mobileWeb/admin/register_item.html', {'form':form})
    except Exception as ex:
        print('====777 : Error occured : ', ex)

это переменная отладки при создании элемента формы enter image description here

это переменная отладки для набора запросов enter image description here

это переменная отладки для 1-го члена набора запросов enter image description here

Конечно, я совершил миграцию, мигрировал.

1 Ответ

1 голос
/ 06 февраля 2020

Я не знаю, почему вы пытаетесь так подойти. ModelForm имеет очень хороший способ обработки FK, и если вы хотите показать name объекта MartModel, то вы можете использовать ModelChoiceField 'to_field_name. Например:

class ItemForm(forms.ModelForm):
    mart_id = forms.ModelChoiceField(queryset=MartModel.objects.all(), to_field_name='name')
    class Meta:
        model = ItemModel
        fields = ['mart_id', 'name', 'price', 'expirationDate', 'stockYn']

Также, пожалуйста, измените имя поля mart_id на mart, потому что под django создается имя поля mart_id, если вы назначаете имя поля для mart.

Наконец, в представлении, вы не должны вызывать cleaned_data[...] перед вызовом form.is_valid(). Если форма не проверена, данные не будут доступны в cleaned_data.


Обновление

(из комментариев) Добавьте метод __str__ внизу MartModel класс:

class MartModel(models.Model):
   ...
   def __str__(self):
       return self.name
...