Django表单无法从请求中获取值

时间:2020-02-06 05:14:29

标签: django django-forms

这是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

这是关于queryset的调试变量 enter image description here

这是关于queryset第一个成员的调试变量 enter image description here

当然我做了移民,移民。

1 个答案:

答案 0 :(得分:1)

我不知道您为什么要尝试这种方法。 ModelForm有很好的处理FK的方法,如果要显示MartModel对象的name,则可以使用ModelChoiceFieldto_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