简体   繁体   English

Django UpdateView:要更新的对象没有值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM