Django UpdateView:要更新的对象没有值 [英] Django UpdateView: Object to update has no values

查看:45
本文介绍了Django UpdateView:要更新的对象没有值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用通用视图 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆