【问题标题】:How can I persist ForeignKey fields into database using Django如何使用 Django 将 ForeignKey 字段保存到数据库中
【发布时间】:2018-11-03 10:53:01
【问题描述】:

我是 Django 新手,我有两个模型是用户和地址,这里用户有两个 外键字段是 'localaddress', 'permanentaddress'

地址模型:

class Address(models.Model):

fulladdress = models.CharField(max_length=1000, null=True, blank=True)
additional_address = models.CharField(max_length=1000, null=True, blank=True)
street_address = models.CharField(max_length=150, null=True, blank=True)
route = models.CharField(max_length=150, null=True, blank=True)
city = models.CharField(max_length=100, null=True, blank=True)
state = models.CharField(max_length=100, null=True, blank=True)
country = models.CharField(max_length=100, null=True, blank=True)
pincode = models.IntegerField(null=True, blank=True)

class Meta:
    db_table = 'address'

用户模型:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
   localaddress = models.ForeignKey(Address, on_delete=models.CASCADE, related_name="localaddress", null=True, blank=True)
   permanentaddress = models.ForeignKey(Address, on_delete=models.CASCADE, related_name="permanentaddress", null=True, blank=True)

    class Meta:
       db_table = 'user'

settings.py:

AUTH_USER_MODEL = 'student.User'# changes built-in user model to ours

这里本地地址和永久地址都具有相同的外键(仅限地址模型)

编辑表格:

forms.py:

class LocaladdressForm(forms.ModelForm):

class Meta:
    model = Address

    fields = ['fulladdress', 'additional_address', 'street_address', 'route', 'city', 'state', 'country', 'pincode']

def save(self, commit=True):
        user = super(LocaladdressForm, self).save(commit=False)
        user.fulladdress = self.cleaned_data['fulladdress']
        user.additional_address = self.cleaned_data['additional_address']
        user.street_address = self.cleaned_data['street_address']
        user.route = self.cleaned_data['route']
        user.city = self.cleaned_data['city']
        user.state = self.cleaned_data['state']
        user.pincode = self.cleaned_data['pincode']
        user.country = self.cleaned_data['country']

        if commit:
            user.save()
        return user

views.py:

def address_form(request):
if request.method == 'POST':
    address = Address()
    form = AddressForm(request.POST, instance=address)
    if form.is_valid():
        form.save()
        userid = request.user.id
        User.objects.filter(pk=userid).update(localaddress=address)
        return redirect(reverse('student:view_profile'))
    else:
        args = {'form': form}
        return render(request, 'student/addressform.html', args)
else:
    form = AddressForm()
    args = {'form': form}
    return render(request, 'student/addressform.html', args)

我用for循环渲染表单元素,不知道哪里做错了

addressform.html:

<form method="post">
    {% csrf_token %}
        {{ form.fulladdress }}
        {{ form.additional_address}}
        {{ form.street_address}}
        {{ form.street_address }}
        {{ form.city }}
        {{ form.state }}
        {{ form.pincode }}
        {{ form.country }}          
</form>     

在这里,我需要将一个表单 localaddress 和另一个表单永久地址外键字段呈现到我的模板。最初我正在尝试第一种形式(本地地址),请帮助我。

提前致谢...

Localaddress 表单截图:我在这里使用 google 地址 api 参考链接自动完成地址表单 Autocomplete Address

I am able to persist address and user object but user object creating new object it is not persisting existing object (means localaddress)

【问题讨论】:

    标签: python django forms templates model


    【解决方案1】:

    我可以部分回答 Django 中的一个概念。

    每当您在两个 Django 模型之间创建关系时,您就可以决定哪个模型将是主模型。在这里你有用户模型和地址模型。我相信在大多数情况下,您会同意 User 模型是主要模型,而 Address 将是子模型或子模型或任何您称之为的模型。

    所以你的ForeignKey 字段应该总是在子模型上。因此,与其在 User 模型上使用 ForeignKey,不如像您所做的那样,您应该这样做:

    address_type_choices = [
        (1, 'Local'),
        (2, 'Permanent'),
    ]
    
    class Address(models.Model):
        user = models.ForeignKey(User)
        type = models.IntegerField(default=1, choices=address_type_choices)
        house = model.CharField(max_length=50)
        road = model.CharField(max_length=50)
        area = model.CharField(max_length=50)
        ...
    

    请更改模型的结构并编辑问题。我相信这也是其他人会建议的。

    记住,主模型不会有外键字段。

    更新:更改了模型以允许您同时维护本地地址和永久地址。

    【讨论】:

    • 除了这个好建议:您不需要将 ForeignKey 字段添加到表单中,因为您的视图应该将地址分配给正确的用户 (request.user)。根据通过表单提交的id 分配用户是完全不安全的。
    • @MiniGunnR 非常感谢您在这里的快速响应,我的用户模型是主模型,地址是子模型,我在这里尝试本地和永久地址外键都具有地址字段,例如(地址行 i我正在存储街道、城市、国家、密码……)。我不确定这是否有效,但我如何维护具有所有地址字段的本地地址和永久地址
    • 如何维护具有本地和永久地址外键的用户模型(这两个字段包含所有地址模型字段),这里我正在尝试一对多关系我不确定是一对多还是多多关系
    • @somesh 我更新了答案以允许您维护两种类型的地址。
    • @MiniGunnR 非常感谢,我更新了我的帖子,一旦我成功持久化地址对象,就可以检查,但在用户表中没有地址 id,这里我创建了两个表单,比如 localaddress 表单和 Permanentaddress 表单我都是现在单独坚持我坚持本地地址,我在这里尝试地址 id 以保存相应的用户外键(本地地址字段)
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多