django 2 - Модели пользователей и профилей пользователей, как получить все поля в одном запросе? - PullRequest
0 голосов
/ 03 июля 2018

Обновление и решение ниже.

Я искал решение, но не вижу ничего, что торчит.

Я создал модель профиля, которая связана со стандартной моделью пользователя через однозначное поле, работающее в админке. Я хочу вытащить все поля / данные для обеих моделей в один набор запросов. Я пытаюсь создать форму редактирования пользователя, и я хочу получить все поля для пользователя и профиля на основе текущего зарегистрированного пользователя и отобразить те поля, которые у меня будут на странице для редактирования, и сохранить эти поля.

Каковы лучшие варианты для достижения этой цели, просто лучше.

class Profile(models.Model):
    address = models.blablabla
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')

def profile_edit(request):
    form = UserProfileForm(request.POST or None)
    instance = Profile.objects.all().filter(user__username=request.user).values # This is the place I need to create a single queryset.
    if request.method == "POST" and form.is_valid():
        form = UserProfileForm(request.POST, instance=instance)
        user_form = form.save()
        print("POST event")
    else:
        form = UserProfileForm(instance=instance)
        print(form)
    return render(request, 'frontend/profile_edit.html', {'form': form})

Я вручную создаю формы в шаблоне, поэтому мне хотелось бы иметь что-то вроде {{form.username}} {{form.profile.address}} или что-то в этом роде. Я, вероятно, делаю плохо, я новичок в Джанго.

UPDATE Комплексное решение

Выполните шаги, чтобы получить доступ к моделям пользователей и профилей в коде и шаблоне.

Я решил не заменять пользовательскую модель своей собственной в случае, если я упустил возможности, предоставляемые django. Это также, казалось, усложняло вещи, которые могли бы причинить боль позже. Итак, я пошел с отдельной моделью UserProfile и прикрепил ее к модели User. Вот что я сделал для будущих читателей.

models.py

from django.db.models.signals import post_save

class UserProfile(models.Model):
#take note of the related_name='profile' this is used to reference the fields in code and template.

#Each field of type 'text' I added default='' at the end, I got an error when it was int based so I removed the flag for that field.  I read this might cause an error when you try and auto-create the profile, see what works for you and you might not want it.

        user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') 
        country = models.CharField(max_length=2, blank=True, null=True, default='')
        ...

    # Auto-create the profile upon user account creation.  It's important to start with a fresh database so the user and profile ID's match.

        def create_user_profile(sender, instance, created, **kwargs):
            if created:
                UserProfile.objects.create(user=instance)

        post_save.connect(create_user_profile, sender=User)
    # Create your models here.

#In code, you can access your user and profile field data like so.

request.user.profile.fieldname
request.user.fieldname

In template you can do the same

{{ user.fieldname }}
{{ user.profile.fieldname }}

1 Ответ

0 голосов
/ 03 июля 2018

Здесь вообще нет необходимости в запросе - вам не нужен набор запросов, вам нужен один экземпляр.

В этом случае request.user.profile выдаст вам весь объект профиля, связанный с текущим пользователем.

...