简体   繁体   English

UpdateView 定义主键

[英]UpdateView define primary key

I am trying to set my primary key in a class based view to a unique value from my models.我正在尝试将基于类的视图中的主键设置为模型中的唯一值。

models.py模型.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视图.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表格.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网址.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'),
]

How can I set the pk on the view "EditStuff" equal to thing from the "Stuff" model?如何设置的意见“EditStuff”的PK等于生命从“东西”的模式? I understand that I can get the primary key with self.kwargs['pk'].我知道我可以使用 self.kwargs['pk'] 获取主键。 However, I do not know how to set it equal to the primary key...但是,我不知道如何将它设置为等于主键...

My best guess is that I should do it inside the dispatch method, nevertheless, I am not entirely sure about it.我最好的猜测是我应该在 dispatch 方法中执行它,但是,我并不完全确定。

First, set slug_field and slug_url_kwarg attributes in your view as首先,将slug_fieldslug_url_kwarg属性设置为

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

Then, update the URL as然后,将 URL 更新为

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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