UpdateView 定义主键
UpdateView define primary key
我正在尝试将基于 class 的视图中的主键设置为模型中的唯一值。
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”模型中的 thing?
我知道我可以用 self.kwargs['pk'] 获取主键。但是不知道怎么设置等于主键...
我最好的猜测是我应该在 dispatch 方法中执行它,但是,我对此并不完全确定。
首先,将您视图中的 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'),
]
我正在尝试将基于 class 的视图中的主键设置为模型中的唯一值。
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”模型中的 thing? 我知道我可以用 self.kwargs['pk'] 获取主键。但是不知道怎么设置等于主键...
我最好的猜测是我应该在 dispatch 方法中执行它,但是,我对此并不完全确定。
首先,将您视图中的 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'),
]