Django - forms.Form 无法保存当前用户和表单有效但未保存
Django - forms.Form can't save current user and form is valid but not saved
我修改了我的代码以使用 forms.ModelForm
以便我可以修改网页表单的宽度。我现在遇到的问题是 ForeignKeys
对 forms.Form 不可用,我需要在表单中保存活动用户,以及提交请求的当前时间。
下面是我的文件(我排除了所有必要的导入)和当前的解决方法,它给了我以下错误:table chemrun_chemrun has no column named owner_id
。我很高兴能得到任何帮助来解决这个问题:)
来自 models.py
class ChemRun(models.Model):
owner = models.ForeignKey('auth.User')
来自 forms.py
class ChemRunForm(forms.ModelForm):
title = forms.CharField(max_length=50)
status = forms.CharField(max_length=20, initial="In queue")
created_date = forms.DateTimeField(initial=timezone.now, required=False)
def __unicode__(self):
return self.title
class Meta:
model = ChemRun
exclude = {'created_date', 'status', 'owner'}
来自 views.py
@verified_email_required
def create(request):
if request.POST:
form = ChemRunForm(request.POST)
if form.is_valid():
m = form.save(commit=False)
m.created_date = timezone.now
m.owner = request.user
m.save()
return HttpResponseRedirect('/accounts/profile')
else:
form = ChemRunForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('interface/newrun.html', args, context_instance=RequestContext(request))
来自 urls.py
urlpatterns = [
url(r'^create/$', 'chemrun.views.create', name='create'),
]
我看到两个解决您问题的实用方法:
- 由于字段 'owner' 是模型的新字段,您必须在迁移中添加一个默认 ID,以将其放入列中到已经存在的数据中。
- 您可以在 'owner' 字段中设置 'blank=null',这样 django 就不会强制该列中的数据。
你在评论中说,在命令 'makemigrations' 之前没有要求你提供任何东西,现在它要求你提供任何东西,这是因为现在你在 table 中有记录,如果你添加一个新列,django 或 postgres 都不知道在旧记录的那个列中放什么,也许你可以 'flush' 你的数据库?当然,前提是是dev数据库。
经过更多的阅读和试验后,我发现了一些额外的要点,可以为未来的读者补充。
错误的第一部分是由于无法 运行 成功执行命令 makemigrations
和随后的 migrate
。我错误地从迁移目录中删除了 __init__.py
。恢复文件并重新运行 命令后,该部分已更正。对于未来,我可以向 clean/reset 迁移推荐以下脚本(取自 this question 的答案之一)。
#!/bin/sh
echo "Starting ..."
echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete
echo ">> Running manage.py makemigrations"
python manage.py makemigrations
echo ">> Running manage.py migrate"
python manage.py migrate
echo ">> Done"
第二部分是能够调整字段的宽度。我在 models.py 中定义了我的字段,但是通过在 forms.py 中添加对等效形式 class 的 Meta class 的小部件调用,我有权调整它,以及更多.这是我的 forms.py:
class ChemRunForm(forms.ModelForm):
class Meta:
model = ChemRun
widgets = {'title': forms.TextInput(attrs={'style':'width: 500px;'})}
exclude = ('owner')
注意:ChemRun
是模型 class,ChemRunForm
是表格 class。 title
和 owner
是我模型的两个字段。
希望这对以后的人有所帮助
我修改了我的代码以使用 forms.ModelForm
以便我可以修改网页表单的宽度。我现在遇到的问题是 ForeignKeys
对 forms.Form 不可用,我需要在表单中保存活动用户,以及提交请求的当前时间。
下面是我的文件(我排除了所有必要的导入)和当前的解决方法,它给了我以下错误:table chemrun_chemrun has no column named owner_id
。我很高兴能得到任何帮助来解决这个问题:)
来自 models.py
class ChemRun(models.Model):
owner = models.ForeignKey('auth.User')
来自 forms.py
class ChemRunForm(forms.ModelForm):
title = forms.CharField(max_length=50)
status = forms.CharField(max_length=20, initial="In queue")
created_date = forms.DateTimeField(initial=timezone.now, required=False)
def __unicode__(self):
return self.title
class Meta:
model = ChemRun
exclude = {'created_date', 'status', 'owner'}
来自 views.py
@verified_email_required
def create(request):
if request.POST:
form = ChemRunForm(request.POST)
if form.is_valid():
m = form.save(commit=False)
m.created_date = timezone.now
m.owner = request.user
m.save()
return HttpResponseRedirect('/accounts/profile')
else:
form = ChemRunForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('interface/newrun.html', args, context_instance=RequestContext(request))
来自 urls.py
urlpatterns = [
url(r'^create/$', 'chemrun.views.create', name='create'),
]
我看到两个解决您问题的实用方法:
- 由于字段 'owner' 是模型的新字段,您必须在迁移中添加一个默认 ID,以将其放入列中到已经存在的数据中。
- 您可以在 'owner' 字段中设置 'blank=null',这样 django 就不会强制该列中的数据。
你在评论中说,在命令 'makemigrations' 之前没有要求你提供任何东西,现在它要求你提供任何东西,这是因为现在你在 table 中有记录,如果你添加一个新列,django 或 postgres 都不知道在旧记录的那个列中放什么,也许你可以 'flush' 你的数据库?当然,前提是是dev数据库。
经过更多的阅读和试验后,我发现了一些额外的要点,可以为未来的读者补充。
错误的第一部分是由于无法 运行 成功执行命令 makemigrations
和随后的 migrate
。我错误地从迁移目录中删除了 __init__.py
。恢复文件并重新运行 命令后,该部分已更正。对于未来,我可以向 clean/reset 迁移推荐以下脚本(取自 this question 的答案之一)。
#!/bin/sh
echo "Starting ..."
echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete
echo ">> Running manage.py makemigrations"
python manage.py makemigrations
echo ">> Running manage.py migrate"
python manage.py migrate
echo ">> Done"
第二部分是能够调整字段的宽度。我在 models.py 中定义了我的字段,但是通过在 forms.py 中添加对等效形式 class 的 Meta class 的小部件调用,我有权调整它,以及更多.这是我的 forms.py:
class ChemRunForm(forms.ModelForm):
class Meta:
model = ChemRun
widgets = {'title': forms.TextInput(attrs={'style':'width: 500px;'})}
exclude = ('owner')
注意:ChemRun
是模型 class,ChemRunForm
是表格 class。 title
和 owner
是我模型的两个字段。
希望这对以后的人有所帮助