UpdateView定义主键

时间:2020-09-08 04:33:48

标签: python django django-views django-class-based-views

我试图将基于类的视图中的主键设置为模型中的唯一值。

models.py

from django.db import models
from django.forms import model_to_dict

class Stuff(models.Model):
    thing = models.CharField(max_length=100, verbose_name="Thing", unique=True)
    item = models.CharField(max_length=100, verbose_name="Item")

    def __str__(self):
        return self.thing

    def toJSON(self):
        item = model_to_dict(self)
        return item

views.py

from django.urls import reverse_lazy
from django.views.generic import CreateView, UpdateView

class NewStuff(CreateView):
    model = Stuff
    form_class = NewStuffForm
    template_name = 'stuff.html'
    success_url = reverse_lazy('search_stuff')

    def post(self, request, *args, **kwargs):
        data = {}
        try:
            action = request.POST['action']
            if action == 'add':
                form = self.get_form()
                data = form.save()
            else:
                data['error'] = "No option has been selected"
        except Exception as e:
            data['error'] = str(e)
        return JsonResponse(data)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'New Stuff'
        context['stuff_url'] = reverse_lazy('search_stuff')
        context['action'] = 'add'
        return context


class EditStuff(UpdateView):
    model = Stuff
    form_class = NewStuffForm
    template_name = 'stuff.html'
    success_url = reverse_lazy('search_stuff')

    def dispatch(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().dispatch(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        data = {}
        try:
            action = request.POST['action']
            if action == 'edit':
                form = self.get_form()
                data = form.save()
            else:
                data['error'] = '"No option has been selected"
        except Exception as e:
            data['error'] = str(e)
        return JsonResponse(data)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'New Stuff'
        context['stuff_url'] = reverse_lazy('search_stuff')
        context['action'] = 'edit'
        return context

forms.py

from django import forms
from .models import Stuff

class NewStuffForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for form in self.visible_fields():
            form.field.widget.attrs['class'] = 'form-control'

    class Meta:
        model = Stuff
        fields = '__all__'

    def save(self, commit=True):
        data = {}
        form = super()
        try:
            if form.is_valid():
                form.save()
            else:
                data['error'] = form.errors
        except Exception as e:
            data['error'] = str(e)
        return data

urls.py

from django.urls import path
from .views import *

urlpatterns = [
    path('stuff/add/', NewStuff.as_view(), name='new_stuff'),
    path('stuff/edit/<str:pk>', EditStuff.as_view(), name='edit_stuff'),
]

如何在视图“ EditStuff”上将 pk 设置为等于“ Stuff”模型中的事物? 我了解可以通过self.kwargs ['pk']获取主键。但是,我不知道如何将其设置为等于主键...

我最好的猜测是我应该在调度方法中执行此操作,但是,我对此并不完全确定。

1 个答案:

答案 0 :(得分:1)

首先,在视图中将 slug_field slug_url_kwarg 属性设置为

class EditStuff(UpdateView):
    slug_field = "thing"
    slug_url_kwarg = "thing"
    # rest of your code

然后,将URL更新为

urlpatterns = [
    path('stuff/add/', NewStuff.as_view(), name='new_stuff'),
    path('stuff/edit/<str:thing>', EditStuff.as_view(), name='edit_stuff'),
]
相关问题