- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 Django 中创建一个画廊应用程序。我有两个模型:Pic 和 Profile,分别代表个人图片和用户个人资料。每个用户在注册网站时都会创建一个配置文件实例。以下是模型:
class Profile(models.Model):
user = models.OneToOneField(User, related_name="profile")
class Pic(models.Model):
profile = models.ForeignKey(Profile, blank=True, null=True)
photo = models.ImageField(upload_to = "photos/%Y/%m/%d/")
我希望用户能够通过 HTML 表单上传图片。当他们上传图像时,我想创建一个 Pic,其 ImageField 对应于上传。我已经为 Pic 模型创建了一个 ModelForm 来完成这个。这是目前的形式:
class PicForm(forms.ModelForm):
class Meta:
model = Pic
fields = ('photo',)
还有 upload_image View :
def upload_image(request):
if request.method == "POST":
form = PicForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('home')
else:
return redirect('upload_image')
else:
form = PicForm()
return render(request, 'pics/upload_image.html', {
'form': form
})
所以问题是,我希望用户能够通过表单设置新图片的照片字段,而不是个人资料字段。我希望将其设置为用户的个人资料。我怎样才能做到这一点?
最佳答案
Bear Brown's answer是一种应该可以解决问题的简单方法。不过会少dry
如果您将在多个地点使用相同的表格。 (虽然在目前的情况下你不会有多少利润,但它可能会给你 future 更多的利润)因为这是一个经常被问到的问题,我会尽量解释得更详细一些让它干燥
,谁知道它可能对您或其他有相同问题的人有益。此外,将表单逻辑保留在 form
中通常是一件好事。
因此,在 PicForm
中获取 user.profile
可以通过在 view< 中传递
方法或函数作为request.user
来实现关键字参数
(kwarg
),并在 __init__
中弹出
>。然后可以在 PicForm
save
方法中使用弹出的
user
BaseModelForm
的前两个参数将您传递的data
和files
作为request.POST
和request.FILES
。要添加接受 kwargs
的参数,您必须在接受 *args 的
.PicForm
中添加 __init__
方法, **kwargs
最终您将不得不应用与 Bear Brown 提到的几乎相同的逻辑。您将不得不通过保存而不提交来从表单中获取数据。此时,您必须将用户的配置文件添加到 Pic
实例,最后在提交时实际保存它。
由于您设置了related_name
,您可以通过self.user.profile
从提交表单的用户处获取配置文件,因为我们定义了self .user
在 __init__
中通过从 kwargs
中弹出 user
。
class PicForm(forms.ModelForm):
class Meta:
model = Pic
fields = ('photo',)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(PicForm, self).__init__(*args, **kwargs)
def save(self, commit=True):
pic = super(PicForm, self).save(commit=False)
pic.profile = self.user.profile
if commit:
pic.save()
return pic
当您遇到上述情况时,您现在可以通过传递 request.POST
、request.FILES
和 request.user
来构建您的表单:
form = PicForm(request.POST, request.FILES, user=request.user)
if form.is_valid():
form.save()
您可能会问,为什么这更符合 future 需求且干
?想象一下你在 15 个不同的位置使用了 PicForm
,我可以用这样的形式来想象。如果您想在保存时更改逻辑,例如根据 user
,您必须在 15 个不同的位置进行更改。使用覆盖时,您可能只需要在一个位置更改它(当然,这并非总是如此)
总之,选择适合你的。
关于python - 试图通过表单创建 Django 模型实例,但我只想从表单中提取一些字段并手动设置其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46550787/
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!