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'),
]

我看到两个解决您问题的实用方法:

  1. 由于字段 'owner' 是模型的新字段,您必须在迁移中添加一个默认 ID,以将其放入列中到已经存在的数据中。
  2. 您可以在 '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。 titleowner 是我模型的两个字段。

希望这对以后的人有所帮助