django - 如何将 ModelForm 与 django-address 一起使用?
问题描述
我正在寻找使用django-address来存储针对个人资料的地址。通过我的网页和 Django 管理员输入地址会导致保存地址,但是,地址并未针对配置文件存储,即配置文件对象不会以地址结尾。如何获取要针对 Profile 模型保存的地址?
# profiles/forms.py
from django import forms
from profiles.models import Profile
from address.forms import AddressField, AddressWidget
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['somefieldsthatsave',
'address',
]
field_classes = {
'address': AddressField,
}
widgets = {
'address': AddressWidget,
}
-
# profiles/models.py
import datetime
from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from guardian.shortcuts import assign_perm
from address.models import AddressField
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
address = AddressField(blank=True, null=True, on_delete=models.CASCADE)
class Meta:
ordering = ["-id"]
permissions = (
('view_profile', 'View profile'),
)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
assign_perm('view_profile', self.user, self)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
-
# profiles/views.py
from django.views.generic.edit import UpdateView
from guardian.mixins import PermissionRequiredMixin
from profiles.models import Profile
from profiles.forms import ProfileUpdateForm
class ProfileOverview(PermissionRequiredMixin, UpdateView):
model = Profile
form_class = ProfileUpdateForm
permission_required = 'view_profile'
谢谢你的时间。
解决方案
您必须在管理文件中将地址定义为内联地址。
# admin.py
from django.contrib import admin
from address.models import Address
from profiles.models import Profile
class AddressInline(admin.StackedInline):
model = Address
@admin.site.register(Profile)
class UserProfile(admin.ModelAdmin):
inlines = (AddressInline,)
推荐阅读
- c# - C#:属性与常量的不同字符串编码
- php - 登录用户名在顶部 Journal 3 Theme Opencart 3.0.3.6 显示原始代码
- delphi - Delphi 将本地化的 DLL 数据嵌入到 EXE
- javascript - Three.js 错误地渲染几何图形
- python - 敌人pygame的奇怪产卵位置
- kotlin-coroutines - 如何收集2个协程流
? - python - SSL:PYTHON 请求上的 WRONG_VERSION_NUMBER
- python - 我想编译我的 python 项目,但我不知道该怎么做
- sqlalchemy - 关联表和常规表有什么区别?
- ios - 颤振错误无效的`Podfile`文件:没有将nil隐式转换为String。我搜索了讨论,但我似乎无法解决问题