Как я могу сохранить поля ForeignKey в базе данных с помощью Django

Я новичок в Django, у меня есть две модели: пользователь и адрес, здесь у пользователя два поля внешнего ключа: 'localaddress', 'constantaddress'

Адресная модель:

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>     

Здесь мне нужно отобразить в моем шаблоне поля одного локального адреса формы и другого постоянного адреса внешнего ключа. Сначала я пробую первую форму (местный адрес), пожалуйста, помогите мне.

Заранее спасибо ...

Скриншот формы локального адреса: Здесь я сделал это Автозаполнение формы адреса, используя ссылку на API адреса Google здесь Автозаполнение адреса

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

Как я могу сохранить поля ForeignKey в базе данных с помощью Django

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
67
1

Ответы 1

Я могу частично ответить по поводу концепции в Django.

Всякий раз, когда вы создаете связь между двумя моделями Django, вы решаете, какая модель будет основной. Здесь у вас есть модель пользователя и модель адреса. Я уверен, что в большинстве случаев вы согласитесь с тем, что модель User является основной моделью, а Address будет подмоделью или дочерней моделью, или как вы ее называете.

Так что ваше поле ForeignKey ВСЕГДА должно быть на подмодели. Поэтому вместо того, чтобы использовать ForeignKey для модели User, как вы это сделали, вы должны сделать что-то вроде этого:

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, отправленного через форму.

dirkgroten 24.05.2018 11:31

@MiniGunnR большое спасибо за быстрый ответ здесь моя модель пользователя - это основная модель, а адрес - подмодель, я пытаюсь здесь как локальные, так и постоянные адреса, внешние ключи имеют такие поля адреса, как (адресная строка, в которой я храню улицу, город, страну, пин-код ...). Я не уверен, что это работает, но как я могу поддерживать как локальный, так и постоянный адрес, имея все поля адреса

somesh 24.05.2018 11:32

Как я могу поддерживать модель пользователя, имеющую локальные и постоянные внешние ключи адреса (эти два поля содержат все поля модели адреса), здесь я пытаюсь установить отношения один ко многим, я не уверен, есть ли отношения один ко многим или многие ко многим

somesh 24.05.2018 11:47

@somesh Я обновил ответ, чтобы вы могли поддерживать оба типа адресов.

MiniGunnR 24.05.2018 13:17

@MiniGunnR Большое спасибо, я обновляю свой пост, могу проверить, как только я успешно сохраню адресный объект, но в таблице пользователя нет идентификатора адреса, здесь я создал две формы, такие как форма локального адреса и формы постоянного адреса, обе я сохраняю отдельно теперь я сохраняю локальный адрес Я пытаюсь указать здесь идентификатор адреса, чтобы сохранить соответствующий внешний ключ пользователя (поле localaddress)

somesh 24.05.2018 13:26

Извините, я не очень четко понимаю. Если вы можете сделать нужную форму в HTML и загрузить снимок экрана, мне будет намного понятнее.

MiniGunnR 24.05.2018 13:30

@MiniGunnR Я добавил скриншот, вы можете проверить выше один раз

somesh 24.05.2018 13:49

@MiniGunnR Я не публикую весь свой html файл Я только разместил поля формы внутри представления Я создал новую адресную форму, как я могу сопоставить идентификатор адреса с полем локального адреса модели пользователя (означает, что всякий раз, когда я сохраняю объект адреса, этот идентификатор должен сохранять поле локального адреса в модели пользователя

somesh 24.05.2018 13:52

@MiniGunnR Наконец, я получил решение в соответствии с моим ответом, я меняю сообщение выше, также большое спасибо за вашу ценную поддержку ...

somesh 25.05.2018 08:10

Рад, что смог помочь.

MiniGunnR 25.05.2018 17:34

Другие вопросы по теме