Как поместить имя пользователя, вошедшего в систему, в базу данных каждый раз при отправке формы - PullRequest
0 голосов
/ 01 октября 2019

У меня есть приложение, в котором пользователь может отправить форму, которая входит в базу данных (POSTGRES).

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

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

Надеюсь, я в порядке,

спасибо, ребята. мой код

models.py

from django.db import models as db_models
from django.contrib.auth.models import User
from django.contrib.gis.db import models


class Fertidb(models.Model):
    user = db_models.ManytoManyField(User, on_delete=models.CASCADE)
    area = models.IntegerField()
    plot = models.FileField(upload_to='KML_FILES', blank=True)

    def __str__(self):
        return f' Parcelles de {self.user.username}'

forms.py

from django import forms
from django.contrib.auth.models import User
from .models import Fertidb


class FertidbForm(forms.ModelForm):
    class Meta:
        model = Fertidb
        labels = {
            "plot": "Importez votre fichier KML"
        }
        fields = ['culture', 'area', 'plot']

views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import FertidbForm
from django.contrib.auth.models import User

title = 'FERTISAT'


@login_required
def fertisatmap(request):

    mapbox_access_token = 'pk.eyJ1IjoiaGFtemFiIiwiYSI6ImNrMHdwYmQ2bzA2OGYzbHB1Z292eGxneDgifQ.rGPQjaoWuOdnq_UdxAfQ_w'
    if request.method == "POST":
        o_form = FertidbForm(request.POST, request.FILES)
        if o_form.is_valid():
            o_form.save(commit=False)
            o_form.user = request.user.username()
            messages.success(request, f'Vos informations ont été envoyées')
            return redirect('fertisat-map')
    else:
        o_form = FertidbForm()
    context = {'title': title, 'o_form': o_form}
    return render(request, 'fertisat/fertisatmap.html ', context, {'mapbox_access_token': mapbox_access_token})

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Попробуйте обновить свой вид следующим образом:

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import FertidbForm
from django.contrib.auth.models import User

title = 'FERTISAT'


@login_required
def fertisatmap(request):

    mapbox_access_token = 'pk.eyJ1IjoiaGFtemFiIiwiYSI6ImNrMHdwYmQ2bzA2OGYzbHB1Z292eGxneDgifQ.rGPQjaoWuOdnq_UdxAfQ_w'
    if request.method == "POST":
        o_form = FertidbForm(request.POST, request.FILES)
        if o_form.is_valid():
            fertidb = o_form.save(commit=False)
            fertidb.user = request.user
            fertidb.save()
            messages.success(request, f'Vos informations ont été envoyées')
            return redirect('fertisat-map')
    else:
        o_form = FertidbForm()
    context = {'title': title, 'o_form': o_form}
    return render(request, 'fertisat/fertisatmap.html ', context, {'mapbox_access_token': mapbox_access_token})

(commit=False) используйте для создания экземпляра модели без отправки в базу данных, затем назначьте текущего пользователя для нового экземпляра модели fertidb.user = request.user и затем вызовите .save() для фиксации ваших данных в базе данных


Кстати, mapbox_access_token предполагается, что они остаются внутри settings.py на случай, если вы захотите загрузить их из переменной среды при развертывании производства. вот так:

settings.py

MAPBOX_ACCESS_TOKEN="pk.eyJ1IjoiaGFtemFiIiwiYSI6ImNrMHdwYmQ2bzA2OGYzbHB1Z292eGxneDgifQ.rGPQjaoWuOdnq_UdxAfQ_w"

views.py

from django.conf import settings

...
def fertisatmap(request):
    mapbox_access_token = settings.MAPBOX_ACCESS_TOKEN

Надеюсь, что поможет!

0 голосов
/ 02 октября 2019

Спасибо за помощь, ребята.

@ Тоан Куок Хо, спасибо, что я сделал изменения, но у меня все еще есть проблема. В базе данных отображается user_id, но мне бы хотелось, чтобы отображалось имя пользователя.

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

user = deb_models.ForeignKey (User, on_delete) models.CASCADE) помещает user_id -> я хотел бы иметь имя пользователя. Как мне это назвать?

models.py

*from django.db import models as db_models
from django.contrib.auth.models import User
from django.contrib.gis.db import models


class Fertidb(models.Model):
    user = db_models.ForeignKey(User, on_delete=models.CASCADE)
    culture = models.CharField(max_length=50)
    area = models.IntegerField()
    plot = models.FileField(upload_to='KML_FILES', blank=True)

    def __str__(self):
        return f' Parcelles de {self.user.username}'*
0 голосов
/ 01 октября 2019

Здесь есть две проблемы:

1. В вашей модели вы хотите User, но в своей форме вы присваиваете ей username, что, я думаю, является строкой.

user = db_models.ManytoManyField(User, on_delete=models.CASCADE)

и

o_form.user = request.user.username()

Просто измените вторую строку на o_form.user = request.user.

2. Вы все равно не сохраняете пользователя.

Вы должны сохранить свою модель снова после назначения пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...