• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Django - problem z walidacja formy i ForeignKey.

VPS Starter Arubacloud
0 głosów
156 wizyt
pytanie zadane 6 października 2020 w Python przez Ventre90 Obywatel (1,170 p.)
zamknięte 8 października 2020 przez Ventre90

Cześć wszystkim,

Pisze aplikacje ToDo lista z mozliwoscia logowania się. Chciałbym aby każdy user miał swoją indywidualną listę po zalogowaniu się.

Problem: Gdy dodaje taksa z panelu admina to wszystko jest widoczne dla poszczególnych userów (moge tez usuwać i edytować taski). Nie moge jednak dodać taska za pomocą forma w aplikacji. Przestało działać jak dodałem do modelu Task pole: models.ForeignKey(User, on_delete=models.CASCADE). Robiąc testy co nie działa doszedłem do wniosku, że if forms.isvalid() - nie jest True i forma sie nie zapisuje ale nie wiem dlaczego. 

Czy powinienem dodać jakieś query o ForeignKey do formy ?

Model:

from django.contrib.auth.models import User

class Task(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=500)
    created_time = models.DateTimeField(auto_now_add=True)
    status = models.BooleanField(default=False)

    def __str__(self):
        return self.title

Forma:

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

class TaskForm(forms.ModelForm):
    
    class Meta:
        model = Task
        fields = '__all__'

class CreateAccount(UserCreationForm):

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

Widok:

@login_required(login_url='login')
def tasks_list(request):
    #tasks = Task.objects.all()
    tasks = Task.objects.filter(owner=request.user)
    form = TaskForm()

    if request.method =='POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

    context = {
        'tasks': tasks,
        'form': form,
    }
    return render(request, 'todo/base.html', context)

 

komentarz zamknięcia: Temat rozwiązany

1 odpowiedź

+1 głos
odpowiedź 6 października 2020 przez Nelson89 Dyskutant (7,720 p.)
wybrane 6 października 2020 przez Ventre90
 
Najlepsza

Cześć,

Formularz na stronie, który Ci się wyświetla ma pole owner? Bo bez wypełnienia tego pola forma nie będzie zwalidowana.

Dlatego musiałbyś edytować klasę TaskForm. W zmiennej fields podaj w liście wszystkie atrybuty modelu z wyjątkiem owner.  Następnie, gdy forma jest zwalidowana wyciągasz poszczególne wartości ze słownika form.data[„<klucz”>]
Użytkownika wyciągasz z requestu. Mając te wartości możesz utworzyć nowy obiekt Task i zapisać go z wykorzystaniem atrybutu save().

np.

from .models import Task


...

    if form.is_valid():
        user = requests.user
        title = form.data[„title”]
        ...
        task = Task(owner=user, title=title, ....)
        task.save()
        
        return ...
....

Pozdrawiam,

Nelson

komentarz 6 października 2020 przez Ventre90 Obywatel (1,170 p.)

@Nelson Twoja pomoc znów okazała się bezcenna. Po tym jak wytłumaczyłeś o co dokładnie chodzi z tą formą już sobie to naprawiłem i wszystko działa jak powinno. Poczytałem też o temacie trochę w dokumentacji ( bo wcześniej szukałem na ślepo bo nie wiedziałem dokładnie czego szukać). Teraz tak to wygląda i działa:

Forma:

class TaskForm(forms.ModelForm):
    
    class Meta:
        model = Task
        #fields = '__all__'
        #fields = ['title','status']
        exclude = ['owner']

Widok:

@login_required(login_url='login')
def tasks_list(request):
    #tasks = Task.objects.all()
    tasks = Task.objects.filter(owner=request.user)
    form = TaskForm()

    if request.method =='POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            task_instance = form.save(commit=False)
            task_instance.owner = request.user
            task_instance.save()
        return redirect('/')

    context = {
        'tasks': tasks,
        'form': form,
    }
    return render(request, 'todo/base.html', context)
komentarz 6 października 2020 przez Nelson89 Dyskutant (7,720 p.)
Elegancko

Podobne pytania

0 głosów
0 odpowiedzi 284 wizyt
pytanie zadane 3 sierpnia 2019 w Python przez reaktywny Nałogowiec (42,120 p.)
0 głosów
1 odpowiedź 566 wizyt
pytanie zadane 29 kwietnia 2020 w Python przez Kubs Mądrala (5,190 p.)
0 głosów
0 odpowiedzi 371 wizyt
pytanie zadane 21 kwietnia 2023 w Python przez tonn204 Mądrala (7,470 p.)

92,959 zapytań

141,921 odpowiedzi

321,152 komentarzy

62,293 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...