我正在尝试将表单中的数据保存到名为“ ModuleNames”的数据库表中,但是它正在更新外部(实例)表的“ 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
forms.py
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.
答案 0 :(得分:0)
我认为问题出在这里
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
。