我有以下的情況,我不知道該怎麼做了更新:Django的更新視圖與相關模型
#models.py
class Task(models.Model):
creation_date = models.DateField(
default=None,
)
name = models.CharField(
max_length=255,
)
description = models.TextField(
max_length=500,
blank=True,
null=True,
)
class TaskDetails(models.Model):
PEND = 1
COMP = 2
TASK_STATUS = (
(PEND, 'pending'),
(COMP, 'completed'),
)
task = models.OneToOneField(
Task,
primary_key=True,
on_delete=models.CASCADE
)
solution = models.CharField(
max_length=255,
)
due_date = models.DateField(
null=True,
default=None,
blank=True,
)
status = models.PositiveSmallIntegerField(
default=1,
choices=TASK_STATUS,
)
現在我的看法
#views.py
class TaskUpdate(UpdateView):
model = Task
second_model = TaskDetails
form_class = TaskForm
second_form_class = TaskDetailsForm
pk_url_kwarg = 'task_id'
def get_context_data(self, **kwargs):
context = super(TaskUpdate, self).get_context_data(**kwargs)
if self.request.method == 'POST':
details_form = self.second_form_class(self.request.POST, prefix='details')
else:
details_object = self.second_model.objects.get(pk=self.kwargs.get(self.pk_url_kwarg))
details_form = self.second_form_class(instance=details_object, prefix='details')
context['details_form'] = details_form
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.form_class(request.POST)
details_form = self.second_form_class(request.POST, prefix='details')
if form.is_valid() and details_form.is_valid():
return self.form_valid(form, details_form)
else:
return self.form_invalid(form, details_form)
def form_valid(self, form, details_form):
form.instance.creation_date = datetime.now().date()
self.object = form.save()
details_form.instance.task = self.object
details_form.save()
return HttpResponseRedirect(self.success_url)
def form_invalid(self, form, details_form):
return self.render_to_response(self.get_context_data(form=form, details_form=details_form))
我也有ModelForms:TaskForm和TaskDetailsForm。這裏不相關。 2種形式一次顯示並提交。 但不是更新的任務和TaskDetails表中現有的記錄,它會創建兩個表
在一個新的,我認爲我的問題是在form_valid。我應該放什麼? 非常感謝
here if'details_form.is_valid()''? – 2014-12-19 12:46:19
我做了一些修改來修復一些錯誤但我仍然得到這個錯誤:*'TaskDetails'對象沒有屬性'更新'* – zwan 2014-12-19 13:31:38
是的,因爲你從「過濾器」更改爲「get」。另一種方法是採取''task.task_details' '對象,然後逐個更新它的字段 – 2014-12-19 13:35:49