将Django表单数据保存到用户

问题描述 投票:0回答:2

我正在创建一个用于普通教育用途的网站,其中一个功能是日历部分,我希望用户能够存储他们的活动,但是当他们登录时,他们可以查看他们创建的事件。这是一个学术任务。

我似乎无法将此日历链接到用户字段。我希望日历表中的每条记录都有一个user_id,它与current_user相同。我知道你可以使用django默认用户auth,但我没有这样做,因为我不知道它,当我意识到它为时已晚。

所以我真正需要做的是当表单有效时,我需要将current_user id的值指定为日历表中student的值。但由于某种原因,我不断遇到问题,并且表单未被检测为有效或程序只是没有分配值。

我的主要目标是让每个用户查看自己的日历。我不介意将当前学生字段更改为外键字段

Student.Views

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})

Student.Models

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)

Student.forms

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 %}
python django django-models django-forms django-views
2个回答
0
投票

将form.save()更改为

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

那就行了。


0
投票

不要让它变得复杂,这必须更容易。如果我明白你想做什么,我会创建我的模型如下:

在这里更新

#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)

渲染此formset以及学生创建其事件的视图,formset自动将学生的事件与日历相关联。

所以你可以添加你的逻辑来做更多。

我希望你明白你应该怎么做来存档这个问题

© www.soinside.com 2019 - 2024. All rights reserved.