Django 创建对象B时,使用对象B的外键创建对象A
在Django管理面板的文本编辑器中创建帖子时,我上传文件。我想通过外键将此文件与当前帖子链接。问题是这个帖子还没有创建,但我需要参考一下。 我的模型:Django 创建对象B时,使用对象B的外键创建对象A,django,python-3.x,django-views,Django,Python 3.x,Django Views,在Django管理面板的文本编辑器中创建帖子时,我上传文件。我想通过外键将此文件与当前帖子链接。问题是这个帖子还没有创建,但我需要参考一下。 我的模型: class UploadFile(models.Model): upload_by = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE, related_name="uploaded_file_author") fil
class UploadFile(models.Model):
upload_by = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE, related_name="uploaded_file_author")
file = models.FileField(null=True, blank=True, upload_to='files/%Y/%m/%d/',)
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="file_post")
我的看法是:
@require_POST
def file_upload(request):
reqfile = UploadFile.objects.create(file=request.FILES['file'], upload_by=request.user, **post="need an object here")**
return JsonResponse({'fileurl': reqfile.file.url})
我上传文件的ajax请求:
file_picker_callback: function(cb, value, meta) {
if (meta.filetype == 'file') {
var input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('accept', 'MIME_type');
input.onchange = function () {
var file = this.files[0];
var reader = new FileReader();
// FormData
var fd = new FormData();
var files = file;
fd.append("file",files);
// AJAX
jQuery.ajax({
url: "/fileupload/file/",
type: "POST",
data: fd,
dataType: 'json',
contentType: false,
processData: false,
cache: false,
async: true
}).done(function(response){
var location = response.fileurl;
reader.onload = function(){
// call the callback and populate the Title field with the file name
cb(location, { download : files.name });
};
reader.readAsDataURL(files);
});
};
input.click();
}
}
我的admin.py:
from django.contrib import admin
from .models import Post, UploadMedia, UploadFile, UploadImage
from .forms import MyTextForm
# Register your models here.
class PostModelAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title", )}
list_display = ["title", "updated", "created"]
list_display_links = ["title"]
list_filter = ["created", "tags"]
search_fields = ["title", "content",]
form = MyTextForm
class Meta:
model = Post
class Media:
js = ('//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js', 'js/csrf_setup.js',
'js/tinymce/tinymce.js', 'js/init-tinymce.js',)
admin.site.register(Post, PostModelAdmin)
如果未创建帖子,但需要创建UploadFile实例,则可以将null=True添加到帖子字段
post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, related_name="file_post")
创建post后,您可以通过以下方式将其链接到upload_文件实例:
upload_file.post = Post.objects.create(...)
upload_file.save()
要么创造
@require_POST
def file_upload(request):
post = Post.objects.create(....)
reqfile = UploadFile.objects.create(file=request.FILES['file'], upload_by=request.user, post=post)
return JsonResponse({'fileurl': reqfile.file.url})
或者检索一个post实例并将其传递到该实例:
from django.shortcuts import get_object_or_404
@require_POST
def file_upload(request, pk):
post = get_object_or_404(Post, pk=pk)
reqfile = UploadFile.objects.create(file=request.FILES['file'], upload_by=request.user, post=post)
return JsonResponse({'fileurl': reqfile.file.url})
如何通过Ajax请求传递pk参数。我使用Ajax请求上传文件。在带有模板标记的模板中,您可以这样做,例如:{{query.pk}这将给出传递给模板的实例的pk。数据:fd,这部分数据:{{query.pk}但不知道如何将实例传递给模板是的,事实是我创建的帖子不在单独的页面上,但是在Django管理页面上。我还不知道管理页面模板在哪里。我还没有这样的经验。我在问题的底部添加了我的Ajax查询。那么你打算在哪里找到你的Ajax呢?