Проверка и сохранение Django ManyToMany - PullRequest
0 голосов
/ 30 марта 2012

Я разрабатываю форму запроса на отпуск для клиента.Форма, которую заполняет сотрудник, позволяет сотруднику выбрать несколько дней, которые он / она хочет снять.Когда сотрудник первоначально просматривает форму, отображается только одна запись даты.Они могут добавлять больше дат динамически (JavaScript), нажав кнопку Добавить.

Настройка базы данных: Form_Table, Date_Table, Form_Date_ManyToMany Table (генерируется Django)

У меня 2 проблемы с Django.

1) Если работник вводит 3 даты, каждое поле даты будет иметь одинаковое имя.Как я могу проверить каждое поле, используя форму Django или ModelForm?Вот пример поля даты.

<input name="dates[]" />
<!-- or -->
<input name="dates" /> <!-- I have read this is the Django way -->

2) В моей базе данных есть связь ManyToMany с формой и датами.Я уверен, что мне нужен ManyToMany, а не просто ForeignKey для отслеживания изменений (это не вопрос).Как я могу сохранить несколько дат (в таблице дат) и иметь связь ManyToMany с формой (в таблице форм), используя Django .?

Я относительно новичок в Python и Django.Я перешел с PHP, так как Django - лучший фреймворк, который я нашел.

Редактировать: Я думаю, я не задал правильный вопрос.Вот дополнительная информация.

# Model
class Date(models.Model):
    date = models.DateField()
    emp_requested = models.ForeignKey(EmployeeRequested,null=True)
    hr_approved = models.ForeignKey(HumanResourcesApproved,null=True)

class Form(models.Model):
    pay_period = models.ForeignKey(PayPeriod)
    employee = models.ForeignKey(Employee)
    ack_ip = models.CharField(max_length=15, default='') 
    emp_signature = models.CharField(max_length=100)
    date_of_hire = models.DateField()
    state = models.ForeignKey(State)
    scheduler = models.ForeignKey(Scheduler)
    scheduler_form = models.ManyToManyField(SchedulerForm)
    hr_status = models.CharField(max_length=100, default='')
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    enabled = models.BooleanField(default=True)
    parent = models.ForeignKey('self',related_name='+')
    root  = models.ForeignKey('self',related_name='+')
    dates = models.ManyToManyField(Date)

# View - this is an ajax call 
def ajax_save_form(request):
    form = EmployeeForm(request.POST or None)
    return HttpResponse(form.is_valid())

# Form
class EmployeeForm(forms.ModelForm):
    employee_name = forms.CharField(max_length=30)
    employee_email = forms.EmailField()
    county = forms.ModelChoiceField(queryset=County.objects.all())
    job_type = forms.ModelChoiceField(queryset=JobType.objects.all())
    pay_period = forms.CharField()
    total_hours = forms.DecimalField()

    class Meta:
            model = Form
            exclude = ( 'employee', 'ack_ip', 'state', 'scheduler', 'scheduler_form', 'hr_status', 'parent', 'root', 'dates',)

# HTML (template)
<!-- Stuff -->
<div id="date-group" class="control-group date-controls">
    <label class="control-label" for="date">Date</label>
    <div class="controls">
        <div class="input-append">
            <input type="text" placeholder="Click to see Calendar"  name="dates[]" class="input-xlarge emp-dates" id="date">
            <span class="add-on"><i class="icon-calendar"></i></span> 
            &nbsp;&nbsp;
            <a id="AddDateBtn" class="btn btn-primary"><i class="icon-plus icon-white"></i> Add additional day</a>
            <br><br>
        </div>
        <div class="pull-left sub-controls">
            <h4>Employee Section</h4>
            <div class="well">
                Reason for Absence:<br>
                <select name="reasons[]" class="emp-reasons">
                    {% for reason in reasons %}
                    <option value="{{ reason.id }}">{{ reason.reason }}</option>
                    {% endfor %}
                </select>
                <span class="add-on emp-reason-help"><i class="icon-question-sign"></i></span> 
                <br><br>
                Hours: <br>
                <select name="hours[]">
                    {% for hour in hours %}
                    <option value="{{ hour }}">{{ hour }}</option>
                    {% endfor %}
                </select>
                <br><br>
                Explanation Required:<br>
                <textarea class="input-xlarge" name="explanations[]"></textarea>
            </div>
        </div>
    </div>
</div>
<!-- Stuff -->

Сотрудник может иметь столько блоков HTML, сколько он хочет.Используя JavaScript, я динамически «копирую» HTML, показанный выше.Это позволяет сотруднику отправлять несколько дат (даты [], часы [], причины [], объяснения []).Мне нужно сохранить каждую группу дат (даты [i], часы [i], причины [i], объяснения [i]) в модели дат.Затем мне нужно иметь отношения ManyToMany с моделью формы и всеми датами, которые были отправлены.Как я могу сделать это с помощью ModelForm.

Я видел в Интернете некоторый код, который предполагает, что это возможно сделать:

form = EmployeeForm()
if form.is_valid():
    # do relationships here

Я также не знаю, как получить значения из дат [], часов [], причины [] и объяснения [] с использованием Django.

1 Ответ

2 голосов
/ 30 марта 2012

Если вам действительно нужно хранить эти даты в отдельной таблице с отношением ManyToMany, то вам следует немного расширить вашу ModelForm.
Сначала укажите класс для вашего поля date , которое должно наследоваться от django.forms.ModelMultipleChoiceField. В ней переопределите функцию clean и создайте там все объекты Date. Функция должна возвращать список идентификаторов созданных объектов (или рассмотреть возможность возврата результатов чистой функции родителя, передав ей этот список идентификаторов). Затем в вашей ModelForm вы просто указываете, что поле принадлежит вашему новому классу, и тогда все проверки и сохранения будут работать.
Надеюсь, это поможет; если я неясно, спросите больше:)

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