在Form类中设置Django字段的值

时间:2012-12-25 23:57:36

标签: django

我正在尝试在Form类中设置Django字段的值。这是我的模特

class Workout(models.Model):
    user = models.ForeignKey(User , db_column='userid')

    datesubmitted = models.DateField() 
    workoutdate = models.DateField(); 
    bodyweight = models.FloatField(null=True);
    workoutname = models.CharField(max_length=250)

这是表单类,我试图在其中实现此目的:

class WorkoutForm(forms.ModelForm):

    class Meta: 
        model = Workout

    def __init__(self,*args, **kwargs):
        # this is obviously wrong, I don't know what variable to set self.data to
        self.datesubmitted = self.data['datesubmitted']

好的,对不起伙计们。我将request.POST数据传递到我视图中的WorkoutForm

w = WorkoutForm(request.POST)

然而,不幸的是,html元素的名称与模型的名称不同。例如,html中没有date submitted字段。这实际上是生成并保存在数据库中的时间戳。

所以我需要能够将它保存在表单类中,我认为。

这就是我尝试将datesubmitted字段设置为datetime.datetime.now()

的原因

基本上我使用表单类来使验证更容易,而且我没有使用它的html输出表单,我完全忽略了。

2 个答案:

答案 0 :(得分:3)

您必须在表单的save方法

中执行此操作
class WorkoutForm(forms.ModelForm):

    class Meta: 
        model = Workout

    def __init__(self,*args, **kwargs):
        super(WorkoutForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kw):
        instance = super(WorkoutForm, self).save(commit=False)
        instance.datesubmitted = datetime.now()
        instance.save()

如何在模型中设置也可以在创建新对象时保存当前日期时间:

datesubmitted = models.DateTimeField(auto_now_add=True)

您可以在表单中设置一些额外的值:

form = WorkOutForm(curr_datetime = datetime.datetime.now(), request.POST) # passing datetime as a keyword argument

然后在表格中获取并设置它:

def __init__(self,*args, **kwargs):
    self.curr_datetime = kwargs.pop('curr_datetime')
    super(WorkoutForm, self).__init__(*args, **kwargs)

答案 1 :(得分:0)

您不应该使用ModelForm。使用普通Form,在视图或方法中创建新模型实例,复制值并返回模型实例。