[英]Django UpdateView: Object to update has no values
I'd like to update an object with generic view updateview.我想用通用视图 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在我的 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 ..并在我的 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:编辑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.编辑get_object 传递对象。
Any suggests?有什么建议吗?
I think your UpdateView
is not returning the right object for your template.我认为您的UpdateView
没有为您的模板返回正确的对象。 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:你只需要在你的forms.py
文件中使用它:
class HabitForm(forms.ModelForm):
class Meta:
model = Habit
fields = ( 'title', 'trigger', 'existingroutine', 'targetbehavior', 'image')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.