簡體   English   中英

將 Django 表單數據保存給用戶

[英]Saving Django form data to a User

我正在創建一個用於一般教育用途的網站,其中一項功能是日歷部分,我希望用戶能夠在其中存儲他們的事件,但是當他們登錄時,他們可以查看他們創建的事件。 這是一個學術任務。

我似乎無法將此日歷鏈接到用戶字段。 我希望日歷表中的每條記錄都有一個與 current_user 相同的 user_id。 我知道您可以使用 django 默認用戶身份驗證,但由於不知道它,我還沒有這樣做,當我意識到為時已晚。

所以我真正需要做的就是當表單有效時,我需要將 current_user id 的值分配為日歷表中學生的值。 但出於某種原因,我不斷遇到問題,並且未檢測到表單有效或程序未分配值。

我的主要目標是讓每個用戶查看他們自己的日歷。 我不介意將當前的學生字段更改為外鍵字段

學生.意見

def calendar(request):

student_obj = Student.objects.get(student_name=current_user)
print(student_obj)


if request.method == 'POST':
    form = EventsForm(initial={'student': '3'} or request.POST)
    print(form.errors)

    if form.is_valid():
        form.save()
        all_events = Events.objects.filter(student=student_obj.id)
        messages.success(request, 'Event Has Been Added')
        return render(request, 'Student/calendar.html', {'all_events': all_events})

    else:
        messages.success(request, 'Event Has NOT Been Added')
        all_events = Events.objects.filter(student=student_obj.id)
        return render(request, 'Student/calendar.html', {'all_events': all_events})

學生模型

class Student(models.Model):
     student_name = models.CharField(max_length=59, default=None)
     username = models.CharField(max_length=59)
     password = models.CharField(max_length=59)
     age = models.PositiveIntegerField()
     date_of_birth = models.DateField(max_length=10)
     form = models.CharField(max_length=3)
     email = models.EmailField(max_length=59)
     present = models.PositiveIntegerField(default=0)
     late = models.PositiveIntegerField(default=0)
     absent = models.PositiveIntegerField(default=0) 
     maths_grade = models.PositiveIntegerField(default=0)
     english_grade = models.PositiveIntegerField(default=0)
     science_grade = models.PositiveIntegerField(default=0)
     behaviour_level = models.PositiveIntegerField(default=0)

    def __str__(self):
        return self.student_name

class Events(models.Model):
    student = models.CharField(max_length=200)
    date = models.DateField(max_length=10, default=None)
    event = models.CharField(max_length=200)
    completed = models.BooleanField(default=False)

學生表格

class EventsForm(forms.ModelForm):
    class Meta:
        model = Events
        fields = ["event", "completed", "date", "student"]

日歷模板

<div class="container" style="color: #fff">
<br/>
{% if messages %}
    {% for message in messages %}

        <div class="alert alert-warning alert-dismissible" roles="alert">
            <button class="close" data-dismiss="alert">
                <small>x</small>
            </button>
            {{ message }}
        </div>

    {% endfor %}
{% endif %}

{% if all_events %}
<div>
<table class="table table-dark table-bordered">

        {% for things in all_events %}


        {% if things.completed %}
            <style>
                .striker {
                    text-decoration: line-through;
                    text-color: black;
                }
            </style>
            <tr class="table-danger striker">
                <td style="color: black">{{ things.date }}</td>
                <td><a href="{% url 'edit' things.id %}", style="color: black">{{ things.event }}</a></td>
                <td><center><a href="{% url 'delete' things.id %}", style="color: black">Delete</a></center></td>
            </tr>

        {% else %}

            <tr>
                <td>{{ things.date }}</td>
                <td ><a href="{% url 'edit' things.id %}", style="color: white">{{ things.event }}</a></td>
                <td><center><a href="{% url 'delete' things.id %}", style="color: white">Delete</a></center></td>
            </tr>

        {% endif %}

        {% endfor %}


</table>
</div>
{% endif %}

將 form.save() 更改為

event = form.save(commit=False)
event.student = request.user
event.save()

這樣就可以了。

不要讓它復雜,這必須更容易。 如果我理解你想做什么,我會創建我的模型如下:

#model.py

from django.db.models.signals import post_save
from django.dispatch import receiver

class Student(models.Model):
    user= models.OneToOneField(User, null=True) #student is user
    #Define student fields...

class Calendar(models.Model):
    #Defile calender fields here along with its default values ...
    user = models.OneToOneField(Student)

'''
this signal populate calender table with  user_id along with its 
calender fields 
'''     
@receiver(post_save, sender=Student)
def create_student_calender(sender, instance, created, **kwargs):
   if created and not kwargs.get('raw', False):
        calendar = Calender(user=instance)
        calendar.save()



class Event(models.Model):
   calender  = models.ForeignKey(Callender, null=True)
   # Define  event fields here ...

使用這樣的模型結構,每當學生創建帳戶時,日歷模型將填充日歷字段和學生的 id 字段。

那么學生如何創建他們的活動呢? 只需創建一個 inlineformset_factory 表單即可在每個學生的日歷上創建事件,如下所示:

#form.py 

from django.forms import inlineformset_factory
from django import forms

class EventForm(forms.ModelForm):
    #Events form fields here...

    class Meta:
        model  = Event
        fields = ["Event's field"]



EventFormSet = inlineformset_factory(Calender, Event, form=EventForm, 
                                      max_num=1, can_delete=False)

使用視圖呈現此表單集以供學生創建他們的事件,該表單集自動將學生的事件關聯到日歷。

所以你可以添加你的邏輯來做更多的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM