Я решил это путем добавления категории к NSMutableArray.
Редактирование: Удаленный ненужный метод благодаря ответу Ladd.
Редактирование: Измененный (arc4random() % nElements)
к arc4random_uniform(nElements)
благодаря ответу Gregory Goltsov и комментариям miho и Редактирования blahdiblah
: улучшение Цикла, благодаря комментарию Редактирования Ron
: Добавленная проверка, что массив не пуст благодаря комментарию Mahesh Agrawal
// NSMutableArray_Shuffling.h
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#else
#include <Cocoa/Cocoa.h>
#endif
// This category enhances NSMutableArray by providing
// methods to randomly shuffle the elements.
@interface NSMutableArray (Shuffling)
- (void)shuffle;
@end
// NSMutableArray_Shuffling.m
#import "NSMutableArray_Shuffling.h"
@implementation NSMutableArray (Shuffling)
- (void)shuffle
{
NSUInteger count = [self count];
if (count <= 1) return;
for (NSUInteger i = 0; i < count - 1; ++i) {
NSInteger remainingCount = count - i;
NSInteger exchangeIndex = i + arc4random_uniform((u_int32_t )remainingCount);
[self exchangeObjectAtIndex:i withObjectAtIndex:exchangeIndex];
}
}
@end
Если вы расширяете форму из ModelForm, используйте аргумент ключевого слова instance
. Здесь мы передаем либо существующий экземпляр
, либо новый, в зависимости от того, редактируем мы или добавляем существующую статью. В обоих случаях для экземпляра установлено поле author
, поэтому commit = False
не требуется. Также обратите внимание, что я предполагаю, что только автор может редактировать свои собственные статьи, отсюда и ответ HttpResponseForbidden.
from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect, render, reverse
@login_required
def edit(request, id=None, template_name='article_edit_template.html'):
if id:
article = get_object_or_404(Article, pk=id)
if article.author != request.user:
return HttpResponseForbidden()
else:
article = Article(author=request.user)
form = ArticleForm(request.POST or None, instance=article)
if request.POST and form.is_valid():
form.save()
# Save was successful, so redirect to another page
redirect_url = reverse(article_save_success)
return redirect(redirect_url)
return render(request, template_name, {
'form': form
})
И в вашем urls.py
:
(r'^article/new/$', views.edit, {}, 'article_new'),
(r'^article/edit/(?P<id>\d+)/$', views.edit, {}, 'article_edit'),
То же редактировать
представление используется как для добавления, так и для редактирования, но только шаблон URL редактирования передает идентификатор в представление. Чтобы это хорошо работало с вашей формой, вам нужно опустить поле author
в форме:
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
exclude = ('author',)
У вас может быть скрытое поле идентификатора в форме, и для формы редактирования оно будет передано вместе с формой для добавления формы, которую вы можно установить его в req.POST, например
formData = req.POST.copy()
formData['id'] = getNewID()
, и передать эти formData в форму