繁体   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