Django UpdateView:要更新的对象没有值 [英] Django UpdateView: Object to update has no values
问题描述
我想用通用视图 updateview 更新一个对象.当我编辑对象时出现问题.我没有得到预填的表格,而是得到一个空白的表格.
我的模板:
{% 扩展 'base.html' %}{% 块内容 %}<div class="容器"><form method="post">{% csrf_token %}{{ form.as_p }}<input class="btn btn-danger" type="submit" value="Update"/><a href="{% url 'display_targetbehavior' %}" class="btn btn-default">带我回去</a></表单>
{% 结束块 %}
在我的 views.py 中
class HabitUpdate(UpdateView):模型 = 习惯form_class = HabitForm#fields = ('title', 'trigger', 'existingroutine', 'targetbehavior', 'image')success_url = reverse_lazy('display_habits')template_name = '习惯/update_habit.html'
我的模型:
class 习惯(models.Model):AFTER = '在我之后'WHEN = '当我'WHENEVER = '每当我'BEFORE = '在我之前'MEANWHILE = '同时我'TRIGGER_CHOICES = ((之后,'在我之后'),(当,'当我'),(每当,'每当我'),(之前,'在我之前'),(同时,同时我"),)标题=models.CharField(max_length=200)触发器=models.CharField(max_length=15,选择=TRIGGER_CHOICES,默认=AFTER)现有例程 = models.ForeignKey('现有例程',on_delete=models.SET_NULL,空白=真,空 = 真,)targetbehavior = models.ForeignKey('目标行为',on_delete=models.SET_NULL,空白=真,空 = 真,)image = models.ImageField(upload_to='habit_image', blank=True)created_by = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, null=True)created_at = models.DateTimeField(default=datetime.now, blank=True)def __str__(self):习惯呈现 = self.title# + '\n ' + self.trigger + '\n ' + str(self.existingroutine) + '\n ' + str(self.targetbehavior)回归习惯介绍def image_url(self):#print(self.image.url)如果 self.image 和 hasattr(self.image, 'url'):返回 self.image.url别的:返回无;
..和我的 forms.py
class HabitForm(forms.ModelForm):元类:模型 = 习惯字段=('标题','触发器','现有例程','目标行为','图像')def save(self, commit=True):习惯 = super(HabitForm, self).save(commit=False)习惯.title = self.cleaned_data['title']习惯.trigger = self.cleaned_data['trigger']习惯.existingroutine = self.cleaned_data['existingroutine']习惯.targetbehavior = self.cleaned_data['targetbehavior']习惯.图像 = self.cleaned_data['图像']如果提交:习惯.save()
编辑urls.py:
from django.conf.urls import include, url
从习惯导入视图作为习惯_视图
urlpatterns = [网址(r'^$',习惯视图.显示习惯,名称='显示习惯'),url(r'^habit/details/(?P<id>\w{0,50})/$', 习惯视图.display_habit_details, name='display_habit_details'),url(r'^habit/details/(?P<id>\w{0,50})/delete/$', 习惯视图.delete_habit, name='delete_habit'),#url(r'^habit/details/update/(?P<id>\w{0,50})/$', 习惯视图.update_habit, name='update_habit'),url(r'^habit/details/update/(?P<pk>\w{0,50})/$',习惯_views.HabitUpdate.as_view(),name='update_habit'),url(r'^habit/create-habit/$',assistance_views.create_habit, name='create_habit'),url(r'^existingroutines/$',习惯视图.display_existing_routines,名称='display_existing_routines'),url(r'^existingroutines/create/$',习惯视图.create_existing_routine,name='create_existing_routine'),url(r'^existingroutines/select/(?P<id>\w{0,50})/$',assistance_views.select_existing_routine, name='select_existing_routine'),url(r'^existingroutines/update/(?P<pk>\w{0,50})/$', 习惯视图.ExistingroutineUpdate.as_view(), name='update_existing_routine'),url(r'^existingroutines/delete/(?P<pk>\w{0,50})/$', 习惯视图.ExistingroutineDelete.as_view(), name='delete_existing_routine'),url(r'^targetbehavior/$', 习惯视图.display_targetbehavior, name='display_targetbehavior'),url(r'^targetbehavior/create/$', 习惯视图.create_targetbehavior, name='create_targetbehavior'),url(r'^targetbehavior/select/(?P<id>\w{0,50})/$',assistance_views.select_targetbehavior, name='select_targetbehavior'),url(r'^targetbehavior/update/(?P<pk>\w{0,50})/$',assistance_views.TargetbehaviorUpdate.as_view(), name='update_targetbehavior'),url(r'^targetbehavior/delete/(?P<pk>\w{0,50})/$',assistance_views.TargetbehaviorDelete.as_view(), name='delete_targetbehavior'),]
通过这个网址,我将更新习惯:
url(r'^habit/details/update/(?P<pk>\w{0,50})/$',习惯_views.HabitUpdate.as_view(), name='update_habit'),
编辑get_object 传递对象.
有什么建议吗?
我认为您的 UpdateView
没有为您的模板返回正确的对象.你有没有试过这个:
class HabitUpdate(UpdateView):模型 = 习惯form_class = HabitFormtemplate_name = '习惯/update_habit.html'success_url = reverse_lazy('display_habits')def get_initial(self):initial = super(HabitUpdate, self).get_initial()打印('初始数据',初始)# 获取当前对象习惯对象 = self.get_object()初始 ['field1'] = 习惯对象.field1初始 ['field2'] = 习惯对象.field2........返回首字母def get_object(self, *args, **kwargs):习惯 = get_object_or_404(习惯,pk=self.kwargs['pk'])回归习惯
而且您只需要在 forms.py
文件中使用它:
class HabitForm(forms.ModelForm):元类:模型 = 习惯字段=('标题','触发器','现有例程','目标行为','图像')
I'd like to update an object with generic view updateview. The problem arises when I edit an object. Instead of reaching a prefilled form, I reach a blank form.
My template for this:
{% extends 'base.html' %}
{% block content %}
<div class="container">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input class="btn btn-danger" type="submit" value="Update" />
<a href="{% url 'display_targetbehavior' %}" class="btn btn-default">Take me back</a>
</form>
</div>
{% endblock %}
In my views.py
class HabitUpdate(UpdateView):
model = Habit
form_class = HabitForm
#fields = ('title', 'trigger', 'existingroutine', 'targetbehavior', 'image')
success_url = reverse_lazy('display_habits')
template_name = 'habits/update_habit.html'
my model:
class Habit(models.Model):
AFTER = 'After I'
WHEN = 'When I'
WHENEVER = 'Whenever I'
BEFORE = 'Before I'
MEANWHILE = 'Meanwhile I'
TRIGGER_CHOICES = (
(AFTER, 'After I'),
(WHEN, 'When I'),
(WHENEVER, 'Whenever I'),
(BEFORE, 'Before I'),
(MEANWHILE, 'Meanwhile I'),
)
title = models.CharField(max_length=200)
trigger = models.CharField(max_length=15, choices=TRIGGER_CHOICES, default=AFTER)
existingroutine = models.ForeignKey(
'Existingroutine',
on_delete=models.SET_NULL,
blank=True,
null = True,
)
targetbehavior = models.ForeignKey(
'Targetbehavior',
on_delete=models.SET_NULL,
blank=True,
null = True,
)
image = models.ImageField(upload_to='habit_image', blank=True)
created_by = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, null=True)
created_at = models.DateTimeField(default=datetime.now, blank=True)
def __str__(self):
habitpresentation = self.title# + '\n ' + self.trigger + '\n ' + str(self.existingroutine) + '\n ' + str(self.targetbehavior)
return habitpresentation
def image_url(self):
#print(self.image.url)
if self.image and hasattr(self.image, 'url'):
return self.image.url
else:
return None;
..and in my forms.py
class HabitForm(forms.ModelForm):
class Meta:
model = Habit
fields = ( 'title', 'trigger', 'existingroutine', 'targetbehavior', 'image')
def save(self, commit=True):
habit = super(HabitForm, self).save(commit=False)
habit.title = self.cleaned_data['title']
habit.trigger = self.cleaned_data['trigger']
habit.existingroutine = self.cleaned_data['existingroutine']
habit.targetbehavior = self.cleaned_data['targetbehavior']
habit.image = self.cleaned_data['image']
if commit:
habit.save()
EDIT urls.py:
from django.conf.urls import include, url
from habits import views as habits_views
urlpatterns = [
url(r'^$', habits_views.display_habits, name='display_habits'),
url(r'^habit/details/(?P<id>\w{0,50})/$', habits_views.display_habit_details, name='display_habit_details'),
url(r'^habit/details/(?P<id>\w{0,50})/delete/$', habits_views.delete_habit, name='delete_habit'),
#url(r'^habit/details/update/(?P<id>\w{0,50})/$', habits_views.update_habit, name='update_habit'),
url(r'^habit/details/update/(?P<pk>\w{0,50})/$', habits_views.HabitUpdate.as_view(), name='update_habit'),
url(r'^habit/create-habit/$', habits_views.create_habit, name='create_habit'),
url(r'^existingroutines/$', habits_views.display_existing_routines, name='display_existing_routines'),
url(r'^existingroutines/create/$', habits_views.create_existing_routine, name='create_existing_routine'),
url(r'^existingroutines/select/(?P<id>\w{0,50})/$', habits_views.select_existing_routine, name='select_existing_routine'),
url(r'^existingroutines/update/(?P<pk>\w{0,50})/$', habits_views.ExistingroutineUpdate.as_view(), name='update_existing_routine'),
url(r'^existingroutines/delete/(?P<pk>\w{0,50})/$', habits_views.ExistingroutineDelete.as_view(), name='delete_existing_routine'),
url(r'^targetbehavior/$', habits_views.display_targetbehavior, name='display_targetbehavior'),
url(r'^targetbehavior/create/$', habits_views.create_targetbehavior, name='create_targetbehavior'),
url(r'^targetbehavior/select/(?P<id>\w{0,50})/$', habits_views.select_targetbehavior, name='select_targetbehavior'),
url(r'^targetbehavior/update/(?P<pk>\w{0,50})/$', habits_views.TargetbehaviorUpdate.as_view(), name='update_targetbehavior'),
url(r'^targetbehavior/delete/(?P<pk>\w{0,50})/$', habits_views.TargetbehaviorDelete.as_view(), name='delete_targetbehavior'),
]
With this url I'm going to update the habit:
url(r'^habit/details/update/(?P<pk>\w{0,50})/$', habits_views.HabitUpdate.as_view(), name='update_habit'),
EDIT get_object delivers object.
Any suggests?
I think your UpdateView
is not returning the right object for your template. Have you tried this:
class HabitUpdate(UpdateView):
model = Habit
form_class = HabitForm
template_name = 'habits/update_habit.html'
success_url = reverse_lazy('display_habits')
def get_initial(self):
initial = super(HabitUpdate, self).get_initial()
print('initial data', initial)
# retrieve current object
habit_object = self.get_object()
initial['field1'] = habit_object.field1
initial['field2'] = habit_object.field2
....
....
return initial
def get_object(self, *args, **kwargs):
habit = get_object_or_404(Habit, pk=self.kwargs['pk'])
return habit
And you only need this in your forms.py
file:
class HabitForm(forms.ModelForm):
class Meta:
model = Habit
fields = ( 'title', 'trigger', 'existingroutine', 'targetbehavior', 'image')
这篇关于Django UpdateView:要更新的对象没有值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!