无法保存Django表单中的数据 - python

我正在尝试将表单中的数据保存到名为“ ModuleNames”的数据库表中,但是它正在更新foreign(instance)表的“ ModuleType”列。

我创建了所述外表的实例,因为它在给外键列分配值时给出​​了不同的错误,并且从各种博客中我了解到需要该实例,但这似乎不是正确的方法。我真的不确定现在该怎么办?

models.py

class ModuleTypes(models.Model):
    ModuleType = models.CharField(max_length = 50)
    ModuleDesc = models.CharField(max_length = 256)
    Sort = models.SmallIntegerField()
    isActive = models.BooleanField()
    slug = models.SlugField(('Type'), max_length=50, blank=True)

class Meta:
    app_label = 'zz'
def save(self, *args, **kwargs):
    if not self.id:
        self.slug = slugify(self.Type) 
    super(ModuleTypes, self).save(*args, **kwargs)

class ModuleNames(models.Model):
    ModuleName = models.CharField(max_length = 50)
    ModuleDesc = models.CharField(max_length = 256)
    ModuleSort = models.SmallIntegerField()
    isActive = models.BooleanField()
    ModuleType = models.ForeignKey(ModuleTypes, on_delete=models.CASCADE, null = True)
    slug = models.SlugField(('ModuleName'), max_length=50, blank=True)

class Meta:
    app_label = 'zz'
def __unicode__(self):
    return self.status

表格

class ModuleForm(forms.ModelForm):
    moduleName = forms.CharField(label='Module Name', max_length=50)
    ModuleDesc = forms.CharField(max_length = 256)
    ModuleSort = forms.IntegerField()
    isActive = forms.BooleanField()
    ModuleType = forms.IntegerField()

class Meta:
    model = ModuleNames
    fields = ('moduleName','ModuleDesc','ModuleSort','isActive','ModuleType')

views.py

def addmodule(request,moduletype):
    template_name = 'module.html'
    modules = ModuleNames.objects.all()
    listmodules = ModuleTypes.objects.get(ModuleType=moduletype)
    modules = ModuleNames.objects.filter(ModuleType_id=listmodules)
    if request.method == 'GET':
        args = {'modules': modules }
        return render(request,template_name, args)

    if request.method == 'POST':
        form = ModuleForm(request.POST, instance=ModuleTypes.objects.get(ModuleType=moduletype))
    if form.is_valid():
        #form.pop('csrfmiddlewaretoken', None)It is annoying this part because of that i put in comment.
        post = form.save(commit=False)
        post.save()
    else:
        #raise error
    return render(request, template_name, {'modules': modules})

谢谢

我没有通过上面的代码得到任何错误,但是当我不使用外部表的“实例”时却得到了下面的错误

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/module/nav-tab/new

Django Version: 2.1.3
Python Version: 3.7.1
Installed Applications:
['Comp',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
34.             response = get_response(request)

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
126.                 response = self.process_exception_by_middleware(e, request)

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/utils/decorators.py" in _wrapped_view
142.                     response = view_func(request, *args, **kwargs)

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/utils/decorators.py" in _wrapped_view
142.                     response = view_func(request, *args, **kwargs)

File "/Users/cem/Documents/Projects/DevComp/Comp/views.py" in addmodule
133.         if form.is_valid():

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/forms/forms.py" in is_valid
185.         return self.is_bound and not self.errors

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/forms/forms.py" in errors
180.             self.full_clean()

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/forms/forms.py" in full_clean
383.         self._post_clean()

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/forms/models.py" in _post_clean
398.             self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/forms/models.py" in construct_instance
 60.             f.save_form_data(instance, cleaned_data[f.name])

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/fields/__init__.py" in save_form_data
854.         setattr(instance, self.name, data)

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py" in __set__
210.                     
self.field.remote_field.model._meta.object_name,

Exception Type: ValueError at /module/nav-tab/new
Exception Value: Cannot assign "1": "ModuleNames.ModuleType" must be a "ModuleTypes" instance.

参考方案

我认为问题出在这里:

form = ModuleForm(request.POST, instance=ModuleTypes.objects.get(ModuleType=moduletype))  # <-- here

您将ModuleTypes作为实例传递,而应该传递ModuleNames模型实例。因此,您应该像这样更新表单:

form = ModuleForm(request.POST, instance=ModuleNames.objects.get(ModuleType=listmodules))  # listmodules is a ModuleType object

较小的重构:

if request.method == 'POST':
    form = ModuleForm(request.POST, instance=ModuleNames.objects.get(ModuleType=listmodules))
    if form.is_valid():  # <-- valid check in post request
        #form.pop('csrfmiddlewaretoken', None)It is annoying this part because of that i put in comment.
        post = form.save()
return render(request, template_name, {'modules': modules})

并且还请根据PEP8 Style Guide在模型字段(模型类的属性)定义中使用snake_case

在返回'Response'(Python)中传递多个参数 - python

我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…

Django表单;使用ModelForm覆盖选择 - python

我想做的是根据页面隐藏或显示一些选择。例如,models.pyUSA = 'usa' FRANCE = 'france' CHINA = 'china' GERMANY = 'germany' SPAIN = 'spain' TOPICS = ( (USA, …

Python exchangelib在子文件夹中读取邮件 - python

我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…

您如何在列表内部调用一个字符串位置? - python

我一直在做迷宫游戏。我首先决定制作一个迷你教程。游戏开发才刚刚开始,现在我正在尝试使其向上发展。我正在尝试更改PlayerAre变量,但是它不起作用。我试过放在列表内和列表外。maze = ["o","*","*","*","*","*",…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…