rva*_*aga 0 django django-views django-class-based-views
我正在使用 djangoCreateView
将图像添加到书中。我将书的 id 作为 url 中的参数传递给基于类的视图。诸如book
和 之类的表单字段language
不会呈现在模板上,而是借助书籍 ID 来获取。
# views.py
class PictureCreateView(CreateView):
model = Upload
fields = "__all__"
book_id = None
def get_initial(self):
initial = super(PictureCreateView, self).get_initial()
initial = initial.copy()
self.book_id = self.kwargs['book_id']
book = Book.objects.get(id=self.book_id)
initial['book'] = book
initial['language'] = language
initial['uploader'] = self.request.user
return initial
# set book_id so it used in the template
def get_context_data(self, **kwargs):
context = super(PictureCreateView, self).get_context_data(**kwargs)
context['book_id'] = self.book_id
return context
def form_valid(self, form, **kwargs):
print('Form is valid')
self.object = form.save()
files = [serialize(self.object)]
data = {'files': files}
response = JSONResponse(data, mimetype=response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return super(PictureCreateView, self).form_valid(form)
def form_invalid(self, form):
print('Form invalid!')
print(form.errors)
data = json.dumps(form.errors)
return HttpResponse(content=data, status=400, content_type='application/json')
# models.py
class Upload(models.Model):
image = models.ImageField(upload_to=get_upload_path, help_text='Image to process')
uploader = models.ForeignKey(settings.AUTH_USER_MODEL, models.CASCADE, related_name='uploader')
language = models.ForeignKey(Language, models.CASCADE)
book = models.ForeignKey(Book, models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
问题是我收到一条错误消息,指出表单无效,并且字段uploader
、book
和language
是必需的。我该如何解决这个问题?
该initial
数据用于显示表单最初显示时的默认值。当提交的表单数据中缺少这些值时,不会使用它。如果像book
和 之类的字段uploader
是从 URL 或登录用户设置的,那么您应该将它们完全保留在表单之外,而不是在初始数据中设置它们。form_valid
然后,您可以在保存表单之前在方法中设置实例上的值。
from django.contrib.auth.mixins import LoginRequiredMixin
class PictureCreateView(LoginRequiredMixin, CreateView):
model = Upload
fields = ['other_field1', 'other_field2', ...] # leave out book, language and uploader
def form_valid(self, form):
self.book_id = self.kwargs['book_id']
book = Book.objects.get(id=self.book_id)
form.instance.book = book
form.instance.language = ????
form.instance.uploader = self.request.user
return super(
Run Code Online (Sandbox Code Playgroud)
确保LoginRequiredMixin
只有登录用户才能访问该视图。
您可能想要使用where 来处理引用一本不存在的书的get_object_or_404
情况。book_id
归档时间: |
|
查看次数: |
4129 次 |
最近记录: |