Django - 表单与模型表单,编辑model.textField,以及获取对象的pk?

时间:2016-06-14 12:48:36

标签: python mysql django forms models

models.py

from django.db import models
from django import forms 

class History(models.Model):
    commentTypes = (
        ('1', 'issues'),
        ('2', 'risks'),
        ('3', 'dependencies'),
        ('4', 'accomplishments'),
        ('6', 'UGM')
    )

    historyID = models.IntegerField()
    projectID = models.IntegerField()
    userID = models.CharField(max_length=6)
    logComments = models.TextField(max_length=1000)
    timeStamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    commentType = models.CharField(max_length=1,choices=commentTypes)

forms.py

class statusTab(ModelForm):
    class Meta:
        model = History
        fields = ['logComments']

views.py

def projectTabs(request):
    form = statusTab(request.POST or None)
    context = {
        "form":statusTab,
    }
    if request.method == 'POST' and form.is_valid():
        instance = form.save(commit=False)
        #instance.historyID = instance.object_instance.pk

        instance.projectID = 1337
        instance.userID = request.user
        # instance.commentType
        instance.save()


    return render(request, "projects/project.html", context)

所以我的问题是,我希望能够创建一个文本框供用户输入有关项目的信息。除非我使用models.textField,否则它会继续logComments: *textbox*,我不想要“logComments”标题。我已经尝试查看文档,但似乎没有任何内容可以指示如何编辑它。

这引出了我的问题的另一部分,使用forms.someField而不是models.someField有什么不同,因为表单似乎有更多的自定义。我正在使用MySQL数据库,所以我想使用模型表格,但令人沮丧的是不可定制的,我很想知道我是否遗漏了一些东西。

另外,最后,我如何获取对象实例的pk id。我们希望通过唯一键记录所有注释,因此我想到为什么不将它与db中的pk对应。除了我执行的google搜索,我找不到返回pk的方法。我发现的最接近的是instance.object_instance.pk的行,它不起作用。

任何关于此的指导都会很棒。在模型表单方面,Django文档似乎缺乏。

1 个答案:

答案 0 :(得分:1)

你的问题涉及很多不同的事情,但我会尝试回答它们。

请参阅rendering form fields manually上的文档。如果您不想显示标签,请将其保留。

在表单中,您应始终使用表单字段(例如forms.CharField)而不是模型字段(例如models.CharField)。对于模型形式也是如此。定义模型类时应使用模型字段。

您可以使用instance.pk获取实例的主键。请注意,在 保存实例之后,您才能执行此操作。在您调用form.save(commit=False)时,实例尚未保存到数据库中,因此它还没有主键。