Django之UpdateView

模型


from .BaseModel import BaseModel
from django.db import models
from django.urls import reverse

class AdvPosition(BaseModel):
    name = models.CharField(max_length=255, help_text = "广告位名称")

    def get_absolute_url(self):
        return reverse('backend:adv-position-index')

    class Meta(BaseModel.Meta):
        db_table =  'adv_position'

模型中需要设定跳转地址,在保存成功后会根据这个地址跳转。

 

url

path('adv-position/update/<int:pk>', AdvPositionUpdateView.as_view(), name = 'adv-position-update'),

由于model使用了app_name

所以需要再urls.py中添加

app_name = 'backend'

update.html

<form class="form-horizontal" action="{{ request.get_full_path }}" method="post">
    {% csrf_token %}
   
  <div class="card-body">
    {{ form.as_ul }}
  </div>
  <div class="card-footer">
    <input type="submit" class="btn btn-info" value="submit" />
  </div>
</form>

view

跟CreateView一样,UpdateView也有很多中方式

方式1:

class AdvPositionUpdateView(UpdateView):
    model = AdvPosition # 指定模型
    template_name = 'adv-position/update.html'
    fields = ['name']

 

方式2:

需要ModelForm,

from django import forms 
from common.models import AdvPosition

class AdvPositionForm(forms.ModelForm):
    class Meta:
        model = AdvPosition
        fields = ['name']
class AdvPositionUpdateView(UpdateView):
    model = AdvPosition # 指定模型
    template_name = 'adv-position/update.html'
    form_class = AdvPositionForm

方式3:

使用get,post

class AdvPositionUpdateView(UpdateView):
    model = AdvPosition # 指定模型
    template_name = 'adv-position/update.html'
    form_class = AdvPositionForm

    def get(self, request, *args, **kwargs):
        adv_positin = AdvPosition.objects.get(id = self.kwargs['pk'])
        #initial = {'name': adv_positin.name}
        #form = self.form_class(initial)
        form = self.form_class(instance=adv_positin)
        return render(request, 'adv-position/update.html', {'form': form})

    def post(self, request, *args, **kwargs):
        adv_positin = AdvPosition.objects.get(id = self.kwargs['pk'])
        adv_positin.name = request.POST.get('name')
        adv_positin.save()
        return redirect('/backend/adv-position/index')

这里注意的是,我们需要给表单初始化已有数据

有种方式

instance和initial

form = self.form_class(instance=adv_positin)
adv = get_object_or_404(AdvPosition, pk=kwargs['pk'])
initial = {'name': adv.name}
form = self.form_class(initial)

方式4:

class AdvPositionUpdateView(UpdateView):
    model = AdvPosition # 指定模型
    template_name = 'adv-position/update.html'

    def get(self, request, *args, **kwargs):
        adv_positin = AdvPosition.objects.get(id = self.kwargs['pk'])
        #initial = {'name': adv_positin.name}
        #form = AdvPositionForm(initial)
        form = AdvPositionForm(instance=adv_positin)
        return render(request, 'adv-position/update.html', {'form': form})

    def post(self, request, *args, **kwargs):
        adv_positin = AdvPosition.objects.get(id = self.kwargs['pk'])
        adv_positin.name = request.POST.get('name')
        adv_positin.save()
        return redirect('/backend/adv-position/index')

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UpdateViewDjango中的一个内置视图,用于更新已存在的对象。以下是一个简单的UpdateView示例: 1. 首先,在你的Django项目中的views.py文件中导入UpdateView和你的模型类: ```python from django.views.generic import UpdateView from .models import YourModel ``` 2. 创建一个继承自UpdateView的视图类,并指定要使用的模型类、表单类和模板: ```python class YourUpdateView(UpdateView): model = YourModel form_class = YourForm template_name = 'your_template.html' success_url = '/success/' # 对象更新成功后重定向到的URL ``` 在这个示例中,我们创建了一个名为YourUpdateView的视图类,使用YourModel作为模型类,YourForm作为表单类,并使用名为your_template.html的模板进行渲染。我们还指定了对象更新成功后要重定向到的URL。 3. 在你的urls.py文件中添加一个URL模式来映射到YourUpdateView: ```python from .views import YourUpdateView urlpatterns = [ # 其他URL模式... path('update/<int:pk>/', YourUpdateView.as_view(), name='update_object'), ] ``` 在这个示例中,我们创建了一个带有参数pk的URL模式,当用户访问/update/1/时,将调用YourUpdateView来显示表单和处理表单数据。其中,`<int:pk>`表示要更新的对象的主键值。 4. 创建一个名为"your_template.html"的模板文件,放在你的Django项目中的templates目录下: ```html <!DOCTYPE html> <html> <head> <title>Update Object</title> </head> <body> <h1>Update Object</h1> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">Update</button> </form> </body> </html> ``` 在这个示例中,我们使用了模板标签{{ form.as_p }}来渲染表单字段,并在<form>标签中添加了CSRF令牌,以确保表单的安全性。 5. 创建一个名为forms.py的文件,并在其中定义YourForm类: ```python from django import forms from .models import YourModel class YourForm(forms.ModelForm): class Meta: model = YourModel fields = '__all__' ``` 在这个示例中,我们创建了一个基于模型的表单类YourForm,使用YourModel作为模型类,并包含所有字段。 现在,当用户访问/update/1/时,Django将使用YourUpdateView来显示your_template.html模板中的表单,并自动填充已存在对象的数据。当用户提交表单数据时,Django将自动验证表单数据并更新对应的YourModel对象。 这只是一个简单的示例,你可以根据自己的需求来扩展和定制UpdateView。可以在Django官方文档中找到更多关于UpdateView的使用说明和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值